Python klase i objekti: Vodič za 2026
Većina Python OOP tutorijala uči sintaksu i preskače mentalni model. Ovaj radi suprotno — otići ćete s jasnom slikom o tome što klasa je tijekom izvođenja, kada posegnuti za @dataclass umjesto da ručno pišete __init__ i kako self stvarno funkcionira (nije magija).
Pokrit ćemo: minimalnu održivu klasu od četiri retka, zašto je self parametar, atribute klase u odnosu na instancu (pogreška broj 1 za početnike), šest dunder metoda koje ćete vidjeti posvuda, @dataclass kao modernu zadanu vrijednost i čvrsto pravilo kada ostaviti klase same i koristiti običnu funkciju.
Mentalni model: klasa je tvornica
Klasa u Pythonu je tvornica koja proizvodi objekte. Svaki put kada pozovete Rect(3, 4), Python stvara svježi objekt s vlastitom pohranom i vraća vam ga.
To je cijela mehanika. Klasa je nacrt; svaki poziv Rect(...) je pečat nacrta u novi RAM.
self je samo parametar
Zabuna broj 1 za ljude koji dolaze iz JS-a ili Rubyja: self u Pythonu je eksplicitan. Prvi parametar svake metode je referenca na instancu koja se poziva.
Dakle, c.bump() je sintaktički šećer za Counter.bump(c). Python prosljeđuje instancu kao prvi argument. Mogli biste to nazvati "ja", "ovo" ili "fuj" - "ja" je konvencija, a ne ključna riječ. Držite se `self' (PEP 8) kako bi drugi programeri Pythona mogli čitati vaš kod.
Zamka atributa klase protiv instance
Najčešći Python OOP bug u bazi koda za početnike:
items = [] u opsegu klase stvara JEDAN popis koji dijeli svaka instanca. a.add("milk") ga mijenja, tako da b.items vidi isti popis.
Pravilo: inicijalizirajte promjenjivo stanje u `__init__`, ne u opsegu klase.
Ova je pogreška otpremljena u proizvodnju više puta nego što će bilo koji programer Pythona priznati. Pazite na popise, diktate, skupove u opsegu klase.
Šest metoda koje ćete vidjeti posvuda
Dunderove metode (__name__) su Pythonove zakačke za preopterećenje operatora. Ovih šest pokriva 95% onoga s čime ćete se susresti:
1. __init__(self, ...) — konstruktor
Pokreće se kada je objekt kreiran. Ovdje postavite atribute instance. Ne vraćaj ništa (Python nameće Ništa).
2. __repr__(self) — niz usmjeren prema razvojnom programeru
Poziva se print(x) ako __str__ nedostaje, i uvijek putem REPL-a. Ciljajte na nešto što biste mogli zalijepiti natrag u Python da ponovno stvorite objekt:
3. __eq__(sebe, drugo) — jednakost
Bez toga, Rect(3, 4) == Rect(3, 4) vraća False (zadano je identitet). Usporedite polje po polje:
4. __hash__(self) — mogućnost raspršivanja
Ako nadjačate __eq__, MORATE također poništiti __hash__ ili Python skupove __hash__ = None (objekt postaje nehashable). Najjednostavnije: return hash((self.width, self.height)).
5. __len__(self) — za len(obj)
Omogućuje rad len(cart) == 5.
6. __iter__(self) — za za x u objektu:
Vrati iterator. yield unutar čini klasu iterabilnom:
@dataclass — moderna zadana vrijednost
Ako je vaša klasa uglavnom nositelj podataka (tri polja, __init__, __repr__, __eq__), prestanite pisati tu šablonu. @dataclass generira sve iz vaših napomena tipa:
Generiraju se __init__, __repr__ i __eq__. Dodajte @dataclass(frozen=True) da biste objekt učinili nepromjenjivim I dobili __hash__ besplatno.
Pravilo: prvo posegnite za `@dataclass`. Napišite ručno izrađenu klasu samo kada trebate metode koje nisu pristupnici atributima.
__slots__ — optimizacija memorije (napredno)
Prema zadanim postavkama svaka instanca nosi __dict__ tako da možete dodati proizvoljne atribute. __slots__ zamjene koje diktiraju za fiksnu strukturu C-razine — manji RAM otisak i brži pristup atributima:
Upotrijebite __slots__ kada: (a) stvarate milijune instanci i RAM je važan, ili (b) želite uhvatiti dodjelu atributa tipfelera tijekom izvođenja. Inače ga preskočite — onemogućuje pickle prema zadanim postavkama i prekida višestruko nasljeđivanje na suptilan način.
Kada ostaviti nastavu na miru
Čvrsto pravilo: ako vaša klasa ima JEDNU metodu plus `__init__`, to bi vjerojatno trebala biti funkcija.
Klase dobivaju svoju težinu kada drže state u više poziva metoda ili kada implementiraju dobro definiran protokol (__iter__, __enter__, __eq__, itd.). Jednokratna logika je funkcija.
Nasljeđe — koristite ga štedljivo
Nasljeđe je stvarno, ali se previše koristi. U Pythonu 2026 preferirajte kompoziciju — držite drugi objekt kao atribut umjesto nasljeđivanja od njega:
Nasljeđujte samo kada imate istinski odnos "je-jeste" I želite nadjačati ponašanje. NamedRect koji nasljeđuje Rect za dodavanje polja name je u redu. Izgradnja hijerarhije nasljeđivanja od pet razina za klasu poslovne logike kod je koji ćete razmrsiti za 6 mjeseci.
Klase su jedna od najmoćnijih značajki Pythona i jedna od najlakših za prekomjernu upotrebu. Mentalni model koji pomaže: klasa je tvornica za objekte, "self" je običan parametar, promjenjivo stanje ide u "__init__", prvo posegnite za "@dataclass" i vratite se na funkciju kad god klasa ima manje od dvije metode za prijenos stanja.
Sljedeći korak: 30 praktičnih OOP lekcija koje pokrivaju klase, @dataclass, nasljeđivanje u odnosu na kompoziciju i dunder metode — sa pravim Pythonom koji radi u vašem pregledniku i AI mentorom na svakom koraku.