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 (x i y punktu; 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.