Kurs: Darmowy kurs Python dla początkujących
Lekcja 11: Podstawy programowania obiektowego
Klasy i obiekty
Programowanie obiektowe (ang. Object-Oriented Programming, OOP) to podejście do programowania, które umożliwia organizację kodu w postaci obiektów reprezentujących rzeczywiste byty. Obiekty są tworzone na podstawie klas, które definiują ich strukturę i zachowanie. Python obsługuje OOP w sposób prosty i intuicyjny.
1. Czym są klasy?
Klasa to schemat, według którego tworzone są obiekty. Klasa definiuje atrybuty (cechy) i metody (zachowania), które będą wspólne dla wszystkich obiektów utworzonych na jej podstawie.
# Definicja klasy class Samochod: marka = "Nieznana" kolor = "Nieznany" # Tworzenie obiektu klasy moj_samochod = Samochod() print(moj_samochod.marka) # Wynik: Nieznana print(moj_samochod.kolor) # Wynik: Nieznany
2. Czym są obiekty?
Obiekt to konkretny egzemplarz klasy. Może mieć swoje unikalne cechy i wykonywać operacje zdefiniowane w klasie. Każdy obiekt ma dostęp do atrybutów i metod swojej klasy.
Przykład:
# Tworzenie dwóch obiektów samochod1 = Samochod() samochod2 = Samochod() # Przypisywanie indywidualnych wartości samochod1.marka = "Toyota" samochod1.kolor = "Czerwony" samochod2.marka = "BMW" samochod2.kolor = "Niebieski" # Wyświetlanie atrybutów print(f"Samochód 1: {samochod1.marka}, {samochod1.kolor}") print(f"Samochód 2: {samochod2.marka}, {samochod2.kolor}")
Wynik:
Samochód 1: Toyota, Czerwony Samochód 2: BMW, Niebieski
3. Konstruktor __init__
Konstruktor to specjalna metoda w Pythonie, oznaczona jako __init__
, która jest automatycznie wywoływana podczas tworzenia obiektu. Konstruktor pozwala na inicjalizację atrybutów obiektu w momencie jego tworzenia.
# Klasa z konstruktorem class Samochod: def __init__(self, marka, kolor): self.marka = marka self.kolor = kolor # Tworzenie obiektów z argumentami samochod1 = Samochod("Toyota", "Czerwony") samochod2 = Samochod("BMW", "Niebieski") # Wyświetlanie atrybutów print(f"Samochód 1: {samochod1.marka}, {samochod1.kolor}") print(f"Samochód 2: {samochod2.marka}, {samochod2.kolor}")
Wynik:
Samochód 1: Toyota, Czerwony Samochód 2: BMW, Niebieski
4. Metody w klasach
Metody to funkcje zdefiniowane wewnątrz klasy, które operują na obiektach tej klasy. Pierwszym argumentem każdej metody w Pythonie jest self
, który odnosi się do bieżącego obiektu.
# Klasa z metodą class Samochod: def __init__(self, marka, kolor): self.marka = marka self.kolor = kolor def opis(self): return f"Samochód marki {self.marka} w kolorze {self.kolor}." # Tworzenie obiektu i wywoływanie metody samochod = Samochod("Toyota", "Czerwony") print(samochod.opis())
Wynik:
Samochód marki Toyota w kolorze Czerwonym.
5. Zmiana atrybutów obiektów
Atrybuty obiektu można zmieniać w dowolnym momencie po jego utworzeniu:
# Zmiana wartości atrybutu samochod.kolor = "Zielony" print(samochod.opis())
Wynik:
Samochód marki Toyota w kolorze Zielonym.
6. Atrybuty i metody klasy a instancji
Atrybuty klasy są wspólne dla wszystkich obiektów klasy, podczas gdy atrybuty instancji są unikalne dla każdego obiektu. Przykład:
class Samochod: liczba_kol = 4 # Atrybut klasy def __init__(self, marka, kolor): self.marka = marka # Atrybut instancji self.kolor = kolor # Atrybut instancji # Dostęp do atrybutu klasy print(Samochod.liczba_kol) # Wynik: 4 # Tworzenie obiektu i dostęp do atrybutu instancji samochod = Samochod("Toyota", "Czerwony") print(samochod.marka) # Wynik: Toyota print(samochod.liczba_kol) # Wynik: 4
Wynik:
4 Toyota 4
Atrybuty i metody
W programowaniu obiektowym klasy i obiekty mają dwa główne elementy:
- Atrybuty – zmienne przypisane do klasy lub obiektu, które przechowują dane.
- Metody – funkcje przypisane do klasy, które definiują zachowanie obiektów.
1. Atrybuty instancji
Atrybuty instancji są unikalne dla każdego obiektu. Tworzymy je zazwyczaj w konstruktorze __init__
. Przykład:
class Samochod: def __init__(self, marka, kolor): self.marka = marka # Atrybut instancji self.kolor = kolor # Atrybut instancji # Tworzenie obiektów z różnymi wartościami atrybutów samochod1 = Samochod("Toyota", "Czerwony") samochod2 = Samochod("BMW", "Niebieski") print(samochod1.marka) # Wynik: Toyota print(samochod2.kolor) # Wynik: Niebieski
2. Atrybuty klasy
Atrybuty klasy są wspólne dla wszystkich obiektów klasy. Definiujemy je bezpośrednio w ciele klasy:
class Samochod: liczba_kol = 4 # Atrybut klasy def __init__(self, marka, kolor): self.marka = marka self.kolor = kolor # Dostęp do atrybutu klasy print(Samochod.liczba_kol) # Wynik: 4 # Atrybut klasy jest taki sam dla wszystkich obiektów samochod1 = Samochod("Toyota", "Czerwony") samochod2 = Samochod("BMW", "Niebieski") print(samochod1.liczba_kol) # Wynik: 4 print(samochod2.liczba_kol) # Wynik: 4
3. Metody instancji
Metody instancji to funkcje, które operują na danych obiektu. Pierwszym argumentem każdej metody musi być self
, który odnosi się do konkretnego obiektu.
class Samochod: def __init__(self, marka, kolor): self.marka = marka self.kolor = kolor def opis(self): return f"Samochód marki {self.marka} w kolorze {self.kolor}." # Tworzenie obiektu i wywoływanie metody instancji samochod = Samochod("Toyota", "Czerwony") print(samochod.opis())
Wynik:
Samochód marki Toyota w kolorze Czerwony.
4. Metody klasy
Metody klasy są oznaczane dekoratorem @classmethod
i jako pierwszy argument przyjmują cls
, który odnosi się do samej klasy (a nie do obiektu). Są one używane do operacji na poziomie klasy.
class Samochod: liczba_kol = 4 # Atrybut klasy @classmethod def zmien_liczbe_kol(cls, nowa_liczba): cls.liczba_kol = nowa_liczba # Zmiana wartości atrybutu klasy za pomocą metody klasy print(Samochod.liczba_kol) # Wynik: 4 Samochod.zmien_liczbe_kol(6) print(Samochod.liczba_kol) # Wynik: 6
5. Metody statyczne
Metody statyczne są oznaczane dekoratorem @staticmethod
. Nie przyjmują one argumentu self
ani cls
, ponieważ nie operują ani na obiektach, ani na klasach. Są one używane do wykonywania niezależnych zadań związanych z klasą.
class Samochod: @staticmethod def przywitaj(): print("Witaj w świecie samochodów!") # Wywoływanie metody statycznej Samochod.przywitaj()
Wynik:
Witaj w świecie samochodów!
6. Zmiana atrybutów obiektów i klas
Możesz modyfikować wartości atrybutów zarówno dla konkretnego obiektu, jak i dla całej klasy:
class Samochod: liczba_kol = 4 # Atrybut klasy def __init__(self, marka, kolor): self.marka = marka # Atrybut instancji self.kolor = kolor # Atrybut instancji # Modyfikacja atrybutów instancji samochod1 = Samochod("Toyota", "Czerwony") samochod1.kolor = "Zielony" print(samochod1.kolor) # Wynik: Zielony # Modyfikacja atrybutów klasy Samochod.liczba_kol = 6 print(Samochod.liczba_kol) # Wynik: 6
7. Przykład praktyczny
Przykład klasy opisującej telefon z metodami instancji, klasy i statycznymi:
class Telefon: liczba_modeli = 0 # Atrybut klasy def __init__(self, marka, model): self.marka = marka self.model = model Telefon.liczba_modeli += 1 def opis(self): return f"Telefon marki {self.marka}, model {self.model}." @classmethod def liczba_wszystkich_modeli(cls): return f"Liczba wyprodukowanych modeli: {cls.liczba_modeli}" @staticmethod def informacja(): print("Telefony to nowoczesne narzędzia komunikacji.") # Przykład użycia telefon1 = Telefon("Apple", "iPhone 13") telefon2 = Telefon("Samsung", "Galaxy S21") print(telefon1.opis()) print(Telefon.liczba_wszystkich_modeli()) Telefon.informacja()
Wynik:
Telefon marki Apple, model iPhone 13. Liczba wyprodukowanych modeli: 2 Telefony to nowoczesne narzędzia komunikacji.
Prosty projekt: Zarządzanie listą zadań
W tym projekcie stworzysz prostą aplikację do zarządzania listą zadań przy użyciu programowania obiektowego w Pythonie. Aplikacja pozwoli na dodawanie, usuwanie i wyświetlanie zadań. Jest to świetny sposób na naukę podstaw programowania obiektowego w praktyce.
1. Struktura klasy
Na początek utworzymy klasę ListaZadan
, która będzie przechowywać listę zadań i metody do zarządzania nimi.
class ListaZadan: def __init__(self): """Konstruktor tworzy pustą listę zadań.""" self.zadania = [] def dodaj_zadanie(self, zadanie): """Dodaje nowe zadanie do listy.""" self.zadania.append(zadanie) print(f"Zadanie '{zadanie}' zostało dodane.") def usun_zadanie(self, zadanie): """Usuwa zadanie z listy, jeśli istnieje.""" if zadanie in self.zadania: self.zadania.remove(zadanie) print(f"Zadanie '{zadanie}' zostało usunięte.") else: print(f"Zadanie '{zadanie}' nie istnieje na liście.") def wyswietl_zadania(self): """Wyświetla wszystkie zadania na liście.""" if not self.zadania: print("Lista zadań jest pusta.") else: print("Twoje zadania:") for i, zadanie in enumerate(self.zadania, start=1): print(f"{i}. {zadanie}")
2. Przykładowe użycie
Oto przykład działania aplikacji:
# Tworzenie obiektu listy zadań moja_lista = ListaZadan() # Dodawanie zadań moja_lista.dodaj_zadanie("Zrobić zakupy") moja_lista.dodaj_zadanie("Odpisać na maile") moja_lista.dodaj_zadanie("Posprzątać mieszkanie") # Wyświetlanie zadań moja_lista.wyswietl_zadania() # Usuwanie zadania moja_lista.usun_zadanie("Odpisać na maile") # Wyświetlanie zadań po usunięciu moja_lista.wyswietl_zadania()
Wynik:
Zadanie 'Zrobić zakupy' zostało dodane. Zadanie 'Odpisać na maile' zostało dodane. Zadanie 'Posprzątać mieszkanie' zostało dodane. Twoje zadania: 1. Zrobić zakupy 2. Odpisać na maile 3. Posprzątać mieszkanie Zadanie 'Odpisać na maile' zostało usunięte. Twoje zadania: 1. Zrobić zakupy 2. Posprzątać mieszkanie
3. Rozszerzenie projektu
Możesz rozbudować projekt, dodając nowe funkcje, takie jak:
- Zapisywanie listy zadań do pliku.
- Odczyt listy zadań z pliku.
- Oznaczanie zadań jako ukończone.
4. Zapisywanie i odczyt z pliku
Oto, jak można dodać funkcję zapisu i odczytu z pliku:
class ListaZadan: def __init__(self): self.zadania = [] def dodaj_zadanie(self, zadanie): self.zadania.append(zadanie) print(f"Zadanie '{zadanie}' zostało dodane.") def usun_zadanie(self, zadanie): if zadanie in self.zadania: self.zadania.remove(zadanie) print(f"Zadanie '{zadanie}' zostało usunięte.") else: print(f"Zadanie '{zadanie}' nie istnieje na liście.") def wyswietl_zadania(self): if not self.zadania: print("Lista zadań jest pusta.") else: print("Twoje zadania:") for i, zadanie in enumerate(self.zadania, start=1): print(f"{i}. {zadanie}") def zapisz_do_pliku(self, nazwa_pliku): with open(nazwa_pliku, "w") as plik: for zadanie in self.zadania: plik.write(zadanie + "\n") print(f"Lista zadań została zapisana do pliku '{nazwa_pliku}'.") def wczytaj_z_pliku(self, nazwa_pliku): try: with open(nazwa_pliku, "r") as plik: self.zadania = [linia.strip() for linia in plik.readlines()] print(f"Lista zadań została wczytana z pliku '{nazwa_pliku}'.") except FileNotFoundError: print(f"Plik '{nazwa_pliku}' nie został znaleziony.")
5. Przykład z zapisem i odczytem
# Tworzenie obiektu listy zadań moja_lista = ListaZadan() # Dodawanie zadań moja_lista.dodaj_zadanie("Zrobić zakupy") moja_lista.dodaj_zadanie("Posprzątać mieszkanie") # Zapis do pliku moja_lista.zapisz_do_pliku("zadania.txt") # Odczyt z pliku moja_lista.wczytaj_z_pliku("zadania.txt") # Wyświetlanie zadań po odczycie moja_lista.wyswietl_zadania()
Wynik:
Zadanie 'Zrobić zakupy' zostało dodane. Zadanie 'Posprzątać mieszkanie' zostało dodane. Lista zadań została zapisana do pliku 'zadania.txt'. Lista zadań została wczytana z pliku 'zadania.txt'. Twoje zadania: 1. Zrobić zakupy 2. Posprzątać mieszkanie
Następna lekcja ==> Tworzenie prostego kalkulatora
Spis Treści - darmowy kurs Python dla początkujących
Lekcja 1: Wprowadzenie do programowania
- Co to jest programowanie?
- Dlaczego warto uczyć się Pythona?
- Instalacja Python i wprowadzenie do edytorów (IDLE, VS Code).
Lekcja 2: Pierwszy program w Pythonie
- Składnia Pythona.
- Wyświetlanie tekstu (funkcja print).
- Komentarze i ich znaczenie.
Lekcja 3: Podstawowe typy danych
- Liczby: int, float.
- Ciągi znaków (stringi).
- Typ logiczny (boolean).
- Funkcja type.
Lekcja 4: Zmienne i operatory
- Deklaracja i przypisywanie zmiennych.
- Operatory arytmetyczne, porównania, logiczne.
Lekcja 5: Listy i krotki
- Tworzenie list i krotek.
- Indeksowanie, dodawanie, usuwanie elementów.
- Operacje na listach.
Lekcja 6: Słowniki i zbiory
- Tworzenie i operacje na słownikach.
- Iteracja po słownikach.
- Zbiory i ich zastosowania.
Lekcja 7: Instrukcje warunkowe
- Instrukcje if, elif, else.
- Operatory logiczne w praktyce.
Lekcja 8: Pętle
- Pętla for i while.
- Instrukcje break, continue, else w pętlach.
Lekcja 9: Funkcje
- Tworzenie i wywoływanie funkcji.
- Argumenty i wartości domyślne.
- Funkcje anonimowe (lambda).
Lekcja 10: Praca z plikami
- Otwieranie, czytanie i zapisywanie plików.
- Obsługa błędów przy pracy z plikami.
Lekcja 11: Podstawy programowania obiektowego
- Klasy i obiekty.
- Atrybuty i metody.
- Prosty projekt: Zarządzanie listą zadań.
Lekcja 12: Tworzenie prostego kalkulatora
- Łączenie funkcji i warunków.
- Obsługa błędów (try-except).
Lekcja 13: Zarządzanie plikami tekstowymi
- Program do przechowywania i wyszukiwania notatek w plikach.
Lekcja 14: Prosta gra tekstowa w Python
- Wprowadzenie do pętli i logiki gry.
- Interaktywna gra konsolowa, np. zgadywanie liczby.
Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: