2.20. První třída

Třída sdružuje data a funkce, které s těmito daty pracují, pod jediným jménem. Sáhnout po ní se vyplatí, když několik částí stavu patří k sobě a většina funkcí ve skriptu bere tutéž sadu hodnot jako argumenty.

2.20.1. Klíčové slovo class

Klíčovým slovem je class. Tělo obsahuje metodu __init__, která se spustí pokaždé, když je vytvořena nová instance:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

p = Point(3, 4)
print(p.x, p.y)

Výstup:

3 4

Point je třída; p je její instance. Závorky ve volání Point(3, 4) vyvolají __init__, který přiřadí argumenty atributům nové instance. self je konvenční jméno pro instanci; self.x nastaví atribut, který budou ostatní metody instance číst.

2.20.2. Kdy použít třídu

Po třídě sáhněte, když platí současně tyto podmínky:

  • Hrstka souvisejících hodnot cestuje všude pohromadě (souřadnice x a y bodu; hodnota, jednotka a časové razítko údaje ze senzoru).

  • Několik funkcí bere tutéž sadu hodnot a pracuje s nimi.

  • Je užitečné udržovat naživu více těchto svazků najednou, navzájem odlišných.

Pokud jsou data jednorázová, obvykle stačí obyčejný dict nebo tuple. Pokud potřebujete jen jediný svazek konstant, postačí proměnné na úrovni modulu. Třídy nejsou výchozí kontejner – své místo si zaslouží tehdy, když chtějí stav a chování držet pohromadě.

2.20.3. Co dělá __init__

__init__ je jen obyčejná metoda. Cokoli, co se v ní přiřadí k self, se stane atributem nové instance:

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)

Výstup:

temperature C []

readings se inicializuje na prázdný seznam – každá nová instance dostane svůj vlastní seznam, nikoli sdílený. Cokoli, co se nepřiřadí k self, je lokální pro __init__ a po jeho návratu zmizí.