Lekcja 7 / obiekty
Klasy i obiekty: gdy dane i zachowanie mają być razem
Słownik jest dobry na start, ale gdy dane i funkcje zaczynają chodzić parami, klasa pomaga trzymać je razem.
Sytuacja z pracy
Masz lekcję z tytułem i statusem ukończenia. Chcesz oznaczać ją jako ukończoną i pytać o czytelny status. Słownik plus osobna funkcja działa, ale przy większej liczbie lekcji robi się niewygodnie.
Najpierw wersja ze słownikiem
lesson = {
"title": "Zmienne",
"completed": False
}
def mark_completed(lesson):
lesson["completed"] = True
mark_completed(lesson)
print(lesson)
Problem
Dane lekcji są w jednym miejscu, a zachowanie w osobnej funkcji. Da się tak żyć, ale przy większym programie łatwo pogubić, które funkcje pasują do których danych. Klasa pozwala opisać własny typ rzeczy: na przykład lekcję.
Kod: klasa Lesson
class Lesson:
def __init__(self, title):
self.title = title
self.completed = False
def mark_completed(self):
self.completed = True
def status_text(self):
if self.completed:
return self.title + " - ukończona"
return self.title + " - do zrobienia"
lesson = Lesson("Zmienne")
print(lesson.status_text())
lesson.mark_completed()
print(lesson.status_text())
Wynik
Zmienne - do zrobienia
Zmienne - ukończona
Jak to czytać?
Przepis na obiekt, np. lekcję.
Konkretny egzemplarz klasy, np. lekcja „Zmienne”.
Dane należące do konkretnego obiektu.
Funkcja należąca do klasy, np.
mark_completed.Mini-zadanie
Utwórz drugi obiekt: Lesson("Warunki") i wypisz jego status.
Ćwiczenie praktyczne
Dodaj do klasy atrybut duration_minutes. Ustaw go w __init__ i dopisz metodę,
która zwraca tekst z tytułem oraz czasem trwania.
Quiz
Czym jest klasa?
Przepisem na obiekty danego typu.
Czym jest obiekt?
Konkretnym egzemplarzem klasy.
Po co jest self?
Żeby metoda mogła pracować na danych konkretnego obiektu.
Co dalej?
W finale połączysz klasy Lesson i Course w mały tracker postępu.