2.20. Pierwsza klasa¶
Klasa grupuje dane i funkcje operujące na tych danych pod jedną nazwą. Sięgnięcie po nią opłaca się, gdy kilka fragmentów stanu należy do siebie i większość funkcji w skrypcie przyjmuje ten sam zestaw wartości jako argumenty.
2.20.1. Słowo kluczowe class¶
Słowem kluczowym jest class. Ciało zawiera metodę __init__, która uruchamia się za każdym razem, gdy tworzona jest nowa instancja:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
p = Point(3, 4)
print(p.x, p.y)
Wynik:
3 4
Point to klasa; p to jej instancja. Nawiasy w wywołaniu Point(3, 4) wywołują __init__, które przypisuje argumenty do atrybutów nowej instancji. self to zwyczajowa nazwa instancji; self.x ustawia atrybut, który będą odczytywać pozostałe metody instancji.
2.20.2. Kiedy używać klasy¶
Sięgnij po klasę, gdy poniższe są prawdziwe jednocześnie:
Garstka powiązanych wartości podróżuje razem wszędzie (
xiypunktu; wartość, jednostka i znacznik czasu odczytu sensora).Kilka funkcji przyjmuje ten sam zestaw wartości i operuje na nich.
Przydatne jest utrzymywanie więcej niż jednego z tych pakietów żywego naraz, odrębnego od pozostałych.
Jeśli dane są jednorazowe, zwykły dict lub tuple zazwyczaj wystarcza. Jeśli potrzebujesz tylko pojedynczego pakietu stałych, zmienne na poziomie modułu są w porządku. Klasy nie są domyślnym kontenerem – zasługują na swoje miejsce, gdy stan i zachowanie chcą się trzymać razem.
2.20.3. Co robi __init__¶
__init__ to po prostu zwykła metoda. Wszystko, co przypisane do self w jej wnętrzu, staje się atrybutem nowej instancji:
class Sensor:
def __init__(self, name, unit):
self.name = name
self.unit = unit
self.readings = []
temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)
Wynik:
temperature C []
readings jest inicjalizowane jako pusta lista – każda nowa instancja otrzymuje własną listę, a nie współdzieloną. Wszystko, co nie jest przypisane do self, jest lokalne dla __init__ i znika, gdy ona kończy działanie.