Dane i czynności w jednym miejscu: tak powstaje obiekt.
Po co klasa, skoro mamy słownik
Definicja klasy i konstruktor __init__
Słowo self i tworzenie obiektów
Metody: jedna liczy wynik, druga zmienia dane
Rozgrzewka · 3 minuty
Co pamiętacie z poprzedniej lekcji?
Co robi random.randint(1, 100) w grze w zgadywanie?
Jak w pętli while policzyć, ile prób zrobił gracz?
Co odda student["grades"], gdy student = {"name": "Ala", "grades": [5, 4, 3]}?
Część 1 · Po co klasa
Słownik trzyma dane, klasa trzyma dane i czynności
Słownik z lekcji 14 dobrze trzyma dane, ale sam nic nie umie. Średnią liczy osobna funkcja obok i trzeba pamiętać, żeby podać jej właściwy słownik. Klasa łączy jedno z drugim: dane i czynności siedzą w tym samym miejscu.
Porównanie z życia: klasa to pusty formularz, który mówi, jakie rubryki ma mieć każdy uczeń. Obiekt to jedna wypełniona kartka. Formularz jest jeden, kartek może być trzydzieści.
docs.python.org, The Python Tutorial, rozdz. 9.3 (A First Look at Classes)
Część 1 · Definicja klasy
Słowo class i konstruktor
class Student:
def __init__(self, name, grades):
self.name = name
self.grades = grades
class zaczyna opis, nazwa idzie wielką literą: Student, nie student.
Po dwukropku wszystko, co należy do klasy, stoi wcięte o cztery spacje.
__init__ to konstruktor: Python uruchamia go sam przy tworzeniu obiektu.
self.name = name zapisuje to z nawiasu do środka nowego obiektu.
Skąd nazwa:init to skrót od angielskiego „initialize”, czyli „ustaw wartości początkowe”. Dwa podkreślniki z obu stron to znak nazwy zarezerwowanej dla Pythona.
docs.python.org, The Python Tutorial, rozdz. 9.3.1 (Class Definition Syntax) · rozdz. 9.3.2 (Class Objects) · PEP 8 (Naming Conventions)
Część 2 · Słowo self
Skąd metoda wie, o który obiekt chodzi?
self to ten obiekt, na którym właśnie pracujemy. W życiu mówicie „moje oceny”, a nie „oceny Ali”, choć chodzi o te same oceny. Metoda robi tak samo: self.grades znaczy „oceny tego ucznia, po którego kropce mnie wywołano”.
Dlatego self stoi pierwszy w nawiasie każdej metody, a przy wywołaniu go nie wpisujecie: obiekt wskazała już kropka.
docs.python.org, The Python Tutorial, rozdz. 9.3.4 (Method Objects)
AttributeError: 'Student' object has no attribute 'nmae'
Literówka w nazwie atrybutu, obiekt takiego nie ma
Ćwiczenie · przy komputerze · 10 minut
Ćwiczenie: klasa Product
Utwórz plik products.py. Napisz klasę Product z konstruktorem, który przyjmuje name i price. Zrób dwa obiekty: book za 12 i bag za 180. Wypisz nazwę i cenę każdego.
Dopisz metodę price_with_tax, która oddaje cenę powiększoną o podatek 23 procent, zaokrągloną do dwóch miejsc. Wypisz wynik dla obu produktów.
Dopisz metodę describe, która oddaje jeden napis z nazwą, ceną i ceną z podatkiem. Wypisz opis obu produktów, potem zmień kropką cenę obiektu bag na 150 i wypisz opis jeszcze raz.
Jak sprawdzić, czy wynik jest dobry
W zadaniu 3 opis po zmianie ceny musi pokazać nową liczbę. Jeśli pokazuje starą, wywołaliście describe przed zmianą. Gdy zobaczycie TypeError, sprawdźcie, czy każda metoda ma self na pierwszym miejscu w nawiasie.
Sprawdzenie
Trzy pytania na koniec
Czym klasa różni się od obiektu?
Dlaczego self stoi pierwszy w nawiasie metody, a przy wywołaniu go nie podajemy?
Czym konstruktor różni się od zwykłej metody?
Podsumowanie
A jak to wygląda w produkcji?
Na lekcji
W produkcji
Status
Klasa Student
W dzienniku elektronicznym osobne klasy opisują ucznia, lekcję, ocenę i nauczyciela
codziennie
Konstruktor __init__
Nowe zamówienie w sklepie powstaje jako obiekt z datą, klientem i listą pozycji ustawionymi na starcie
codziennie
Metoda z return
Cena z podatkiem, rabat i koszt wysyłki: każda z tych liczb ma w sklepie własną metodę
standard w firmach
Wiele obiektów jednej klasy
Lista obiektów w jednej zmiennej i własny wygląd obiektu przy print