Triedy a objekty Pythonu: Návod na rok 2026
Väčšina tutoriálov Python OOP učí syntax a preskakuje mentálny model. Toto robí opak – odídete s jasným obrazom toho, čo trieda je za behu, kedy siahnuť po @dataclass namiesto ručného písania __init__ a ako self skutočne funguje (nie je to mágia).
Pokryjeme: štvorriadkovú minimálnu životaschopnú triedu, prečo je self parametrom, atribúty triedy vs inštancie (chyba č. 1 pre začiatočníkov), šesť dunderových metód, ktoré uvidíte všade, @dataclass ako modernú predvolenú hodnotu a tvrdé pravidlo, kedy nechať triedy na pokoji a použiť obyčajnú funkciu.
Mentálny model: trieda je továreň
Trieda v Pythone je továreň, ktorá produkuje objekty. Zakaždým, keď zavoláte Rect(3, 4), Python vytvorí nový objekt s vlastným úložiskom a odovzdá vám ho späť.
To je celý mechanik. Trieda je plán; každé volanie Rect(...) je pečiatkou plánu do čerstvej pamäte RAM.
„ja“ je len parameter
Zmätok č. 1 pre ľudí pochádzajúcich z JS alebo Ruby: „ja“ v Pythone je explicitný. Prvý parameter každej metódy je odkaz na volanú inštanciu.
Takže c.bump() je syntaktický cukor pre Counter.bump(c). Python odovzdá inštanciu ako prvý argument. Môžete to nazvať „ja“, „toto“ alebo „foo“ – „ja“ je konvencia, nie kľúčové slovo. Držte sa self (PEP 8), aby ostatní vývojári Pythonu mohli čítať váš kód.
Pasca atribútu triedy verzus inštancia
Najbežnejšia chyba Python OOP v kódovej základni pre začiatočníkov:
items = [] v rozsahu triedy vytvorí JEDEN zoznam zdieľaný každou inštanciou. a.add("milk") ho zmutuje, takže b.items vidí rovnaký zoznam.
Pravidlo: inicializujte premenlivý stav v `__init__`, nie v rozsahu triedy.
Táto chyba bola odoslaná do produkcie viackrát, ako si ktorýkoľvek vývojár Pythonu pripustí. Sledujte zoznamy, diktáty, súbory v rozsahu triedy.
Šesť metód, ktoré uvidíte všade
Metódy Dunder (__name__) sú háky preťaženia operátorov Pythonu. Týchto šesť pokrýva 95 % toho, s čím sa stretnete:
1. __init__(self, ...) — konštruktor
Spustí sa pri vytvorení objektu. Tu nastavte atribúty inštancie. Nič nevracajte (Python vynucuje None).
2. __repr__(self) — reťazec pre vývojárov
Volá ho print(x), ak __str__ chýba, a vždy REPL. Zamerajte sa na niečo, čo by ste mohli vložiť späť do Pythonu, aby ste znova vytvorili objekt:
3. __eq__(self, other) — rovnosť
Bez nej vráti Obdĺžnik(3, 4) == Obdĺžnik(3, 4) False (predvolená je identita). Porovnajte pole po poli:
4. __hash__(self) — hašovateľnosť
Ak prepíšete __eq__, MUSÍTE prepísať aj __hash__ alebo množiny Pythonu __hash__ = None (objekt sa stane nehašovateľným). Najjednoduchšie: return hash((self.width, self.height)).
5. __len__(self) — pre len(obj)
Funguje len(cart) == 5.
6. __iter__(self) — pre for x v obj:
Vráťte iterátor. yield vo vnútri robí triedu iterovateľnou:
@dataclass — moderné predvolené nastavenie
Ak je vaša trieda väčšinou držiteľom údajov (tri polia, __init__, __repr__, __eq__), prestaňte písať tento štandardný kód. @dataclass to všetko vygeneruje z vašich anotácií typu:
To sú všetky vygenerované __init__, __repr__ a __eq__. Pridajte @dataclass(frozen=True), aby sa objekt stal nemenným A získajte __hash__ zadarmo.
Pravidlo: najprv siahnite po `@dataclass`. Ručne valcovanú triedu napíšte iba vtedy, keď potrebujete metódy, ktoré nie sú prístupovými objektmi atribútov.
__slots__ — optimalizácia pamäte (pokročilé)
Štandardne každá inštancia nesie __dict__, takže môžete pridať ľubovoľné atribúty. __slots__ swapy, ktoré diktujú pevnú štruktúru na úrovni C – menšie nároky na RAM a rýchlejší prístup k atribútom:
__slots__ použite, keď: (a) vytvárate milióny inštancií a záleží na RAM, alebo (b) chcete zachytiť preklepy pri priraďovaní atribútov za behu. V opačnom prípade to preskočte – v predvolenom nastavení zakáže morenie a jemnými spôsobmi preruší viacnásobné dedičstvo.
Kedy opustiť vyučovanie sám
Tvrdé pravidlo: ak má vaša trieda JEDNU metódu plus `__init__`, pravdepodobne by to mala byť funkcia.
Triedy získavajú svoju váhu, keď majú stav vo viacerých volaniach metód alebo keď implementujú dobre definovaný protokol (__iter__, __enter__, __eq__ atď.). Jednorazová logika je funkcia.
Dedičstvo — používajte ho s mierou
Dedičstvo je skutočné, ale nadmerne využívané. V 2026 Pythone uprednostňujte kompozíciu — podržte iný objekt ako atribút namiesto dedenia z neho:
Deďte len vtedy, keď máte skutočný vzťah „je-a“ A chcete zmeniť správanie. Pole „NamedRect“, ktoré dedí z „Rect“ na pridanie poľa „name“, je v poriadku. Vybudovanie päťúrovňovej hierarchie dedičnosti pre triedu obchodnej logiky je kód, ktorý rozmotáte za 6 mesiacov.
Triedy sú jednou z najvýkonnejších funkcií Pythonu a jednou z najjednoduchších na nadmerné používanie. Mentálny model, ktorý pomáha: trieda je továreň na objekty, self je obyčajný parameter, premenlivý stav vstupuje do __init__, najprv siahnite po @dataclass a vráťte sa späť k funkcii vždy, keď má trieda menej ako dve metódy prenášajúce stav.
Ďalší krok: 30 praktických lekcií OOP zahŕňajúce triedy, @dataclass, dedičnosť verzus zloženie a dunderove metódy – so skutočným Pythonom spusteným vo vašom prehliadači a s mentorom AI na každom kroku.