Třídy a objekty Pythonu: Výukový program 2026
Většina Python OOP tutoriálů učí syntaxi a přeskakuje mentální model. Tenhle dělá pravý opak – odcházíte s jasnou představou o tom, co je třída za běhu, kdy sáhnout po @dataclass místo ručního psaní __init__ a jak self skutečně funguje (není to kouzlo).
Probereme: čtyřřádkovou minimální životaschopnou třídu, proč je self parametrem, atributy třídy vs. instance (chyba pro začátečníky č. 1), šest dunderových metod, které uvidíte všude, @dataclass jako moderní výchozí nastavení a tvrdé pravidlo, kdy nechat třídy na pokoji a použít obyčejnou funkci.
Mentální model: třída je továrna
Třída v Pythonu je továrna, která produkuje objekty. Pokaždé, když zavoláte Rect(3, 4), Python vytvoří nový objekt s vlastním úložištěm a předá vám ho zpět.
To je celý mechanik. Třída je plán; každé volání Rect(...) je razítkem plánu do čerstvé paměti RAM.
self je jen parametr
Zmatek č. 1 pro lidi pocházející z JS nebo Ruby: self v Pythonu je explicitní. První parametr každé metody je odkaz na volanou instanci.
Takže c.bump() je syntaktický cukr pro Counter.bump(c). Python předá instanci jako první argument. Dalo by se to nazvat „já“, „toto“ nebo „foo“ – „já“ je konvence, nikoli klíčové slovo. Držte se self (PEP 8), aby ostatní vývojáři Pythonu mohli číst váš kód.
Past atributu třídy vs. instance
Nejběžnější chyba Python OOP v kódové základně pro začátečníky:
items = [] v rozsahu třídy vytvoří JEDEN seznam sdílený každou instancí. a.add("milk") jej zmutuje, takže b.items vidí stejný seznam.
Pravidlo: inicializujte proměnlivý stav v `__init__`, nikoli v rozsahu třídy.
Tato chyba byla odeslána do produkce vícekrát, než kterýkoli vývojář Pythonu připustí. Sledujte seznamy, diktáty, sady v rozsahu třídy.
Šest metod, které uvidíte všude
Metody Dunder (__name__) jsou háky přetěžující operátory Pythonu. Těchto šest pokrývá 95 % toho, s čím se setkáte:
1. __init__(self, ...) — konstruktor
Spustí se při vytvoření objektu. Zde nastavte atributy instance. Nic nevracejte (Python vynucuje None).
2. __repr__(self) — řetězec pro vývojáře
Volá se pomocí print(x), pokud __str__ chybí, a vždy pomocí REPL. Zaměřte se na něco, co byste mohli vložit zpět do Pythonu a znovu vytvořit objekt:
3. __eq__(já, jiný) — rovnost
Bez něj vrátí Obdélník(3, 4) == Obdélník(3, 4) False (výchozí je identita). Porovnat pole po poli:
4. __hash__(self) — hašovatelnost
Pokud přepíšete __eq__, MUSÍTE také přepsat __hash__ nebo sady Pythonu __hash__ = Žádný (objekt se stane nehašovatelným). Nejjednodušší: return hash((self.width, self.height)).
5. __len__(self) — pro len(obj)
Funguje len(cart) == 5.
6. __iter__(self) — pro for x v obj:
Vraťte iterátor. yield uvnitř dělá třídu iterovatelnou:
@dataclass — moderní výchozí nastavení
Pokud je vaše třída většinou držitelem dat (tři pole, __init__, __repr__, __eq__), přestaňte psát tento vzor. @dataclass to vše vygeneruje z vašich typových anotací:
To jsou všechny vygenerované __init__, __repr__ a __eq__. Přidejte @dataclass(frozen=True), aby byl objekt neměnný A získejte __hash__ zdarma.
Pravidlo: nejprve sáhněte po `@dataclass`. Ručně vytvořenou třídu napište pouze v případě, že potřebujete metody, které nejsou přístupovými objekty atributů.
__slots__ — optimalizace paměti (pokročilé)
Ve výchozím nastavení každá instance nese __dict__, takže můžete přidat libovolné atributy. __slots__ swapy, které diktují pevnou strukturu na úrovni C – menší nároky na RAM a rychlejší přístup k atributům:
__slots__ použijte, když: (a) vytváříte miliony instancí a záleží na paměti RAM nebo (b) chcete zachytit překlepy přiřazené atributy za běhu. V opačném případě to přeskočte – ve výchozím nastavení deaktivuje pickle a rafinovaným způsobem přeruší vícenásobnou dědičnost.
Kdy opustit vyučování o samotě
Tvrdé pravidlo: pokud má vaše třída JEDNU metodu plus `__init__`, měla by to být pravděpodobně funkce.
Třídy získávají svou váhu, když drží stav napříč více voláními metod nebo když implementují dobře definovaný protokol (__iter__, __enter__, __eq__ atd.). Jednorázová logika je funkce.
Dědičnost — používejte ji střídmě
Dědičnost je skutečná, ale nadměrně využívaná. V 2026 Pythonu upřednostňujte složení — držte jiný objekt jako atribut namísto zdědění z něj:
Dědit pouze v případě, že máte skutečný vztah „je-a“ A chcete potlačit chování. NamedRect, který zdědí z Rect pro přidání pole name je v pořádku. Vytvoření pětiúrovňové hierarchie dědičnosti pro třídu obchodní logiky je kód, který rozmotáte za 6 měsíců.
Třídy jsou jednou z nejvýkonnějších funkcí Pythonu a jednou z nejjednodušších k nadměrnému používání. Mentální model, který pomáhá: třída je továrna na objekty, self je prostý parametr, proměnlivý stav přechází v __init__, nejprve sáhněte po @dataclass a přejděte zpět na funkci, kdykoli má třída méně než dvě metody přenášející stav.
Další krok: 30 praktických lekcí OOP zahrnující třídy, @dataclass, dědičnost vs složení a dunderovy metody – se skutečným Pythonem běžícím ve vašem prohlížeči a mentorem AI na každém kroku.