NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 12 - Statika v Pythonu - Třídní atributy

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jean Kocman :1.12.2024 23:18

Nevím, kde dělám chybu, ale ztrácím se víc a víc...

 
Odpovědět
1.12.2024 23:18
Avatar
DarkCoder
Člen
Avatar
DarkCoder:2.12.2024 15:47

V článku správně uvádíte, že třídní atributy jsou sdílené mezi všemi instancemi třídy. Ale tato informace dost zaniká když ji nevypíchnete a neukážete praktický příklad.

Třídní atributy v Pythonu jsou atributy (neboli proměnné), které jsou přiřazeny samotné třídě, nikoli jejím instancím. To znamená, že všechny instance dané třídy sdílejí stejné hodnoty těchto atributů, protože jsou uloženy na úrovni třídy, nikoli na úrovni jednotlivých objektů.

Třídní atributy jsou definovány přímo v těle třídy, mimo jakékoliv metody. Jsou dostupné všem instancím této třídy a mohou být měněny jak zvenčí, tak i uvnitř třídy.

Příklad:

class Auto:
    # Třídní atribut
    pocet_kol = 4

    def __init__(self, model):
        # Instanční atribut
        self.model = model

# Vytvoření instancí
auto1 = Auto("Škoda")
auto2 = Auto("Toyota")

# Přístup k třídnímu atributu
print(auto1.pocet_kol)  # 4
print(auto2.pocet_kol)  # 4

# Změna třídního atributu
Auto.pocet_kol = 6
print(auto1.pocet_kol)  # 6
print(auto2.pocet_kol)  # 6

V tomto příkladu je pocet_kol třídním atributem. Když změníme hodnotu tohoto atributu v samotné třídě (Auto.pocet_kol = 6), změna se promítne do všech instancí této třídy.

K čemu slouží třídní atributy:
Sdílení dat mezi instancemi: Třídní atributy jsou ideální pro hodnoty, které mají být stejné pro všechny instance třídy, jako například počet kol pro třídu Auto.

Optimalizace paměti: Pokud máte hodnoty, které budou stejné pro všechny objekty, místo jejich ukládání do každé instance (což by bylo paměťově náročné), můžete je uložit jako třídní atribut. To znamená, že tato hodnota se nachází pouze na úrovni třídy a neexistuje její duplikace pro každou instanci.

Udržování globálních parametrů: Třídní atributy mohou sloužit pro uchování hodnot, které mají globální význam pro všechny instance třídy, např. konstanty, limity, konfigurace apod.

Rozdíl mezi instančními a třídními atributy:
Instanční atributy jsou specifické pro konkrétní objekt (instanci třídy). Tyto atributy jsou definovány uvnitř metody __init__ nebo jinými metodami a každá instance třídy má vlastní kopii těchto atributů.
Třídní atributy jsou sdílené mezi všemi instancemi třídy, což znamená, že pokud dojde k jejich změně, změní se pro všechny instance.

Příklad:

class Auto:
    # Třídní atribut
    pocet_kol = 4

    def __init__(self, model):
        # Instanční atribut
        self.model = model

# Vytvoření instancí
auto1 = Auto("Škoda")
auto2 = Auto("Toyota")

# Změna instančního atributu
auto1.model = "Audi"
print(auto1.model)  # "Audi"
print(auto2.model)  # "Toyota"

# Změna třídního atributu
Auto.pocet_kol = 6
print(auto1.pocet_kol)  # 6
print(auto2.pocet_kol)  # 6

V tomto případě jsou model a pocet_kol různými typy atributů – model je instanční atribut, který je specifický pro každou instanci, zatímco pocet_kol je třídní atribut, který je sdílen mezi všemi instancemi.

Pokud chceš sledovat, kolik instancí třídy bylo vytvořeno, můžeš použít třídní atribut, který se bude zvyšovat při každém vytvoření nové instance a snižovat při jejím zničení (pomocí metody __del__).

Příklad:

class Auto:
    # Třídní atribut pro uchovávání počtu instancí
    pocet_instanci = 0

    def __init__(self, model):
        self.model = model

        # Zvýšení počtu instancí při vytvoření nové instance
        Auto.pocet_instanci += 1

    def __del__(self):
        # Snížení počtu instancí při zničení instance
        Auto.pocet_instanci -= 1

# Vytvoření instancí
auto1 = Auto("Škoda")
auto2 = Auto("Toyota")

# Zobrazení počtu aktivních instancí
print(Auto.pocet_instanci)  # 2

# Zničení jedné instance
del auto1

# Zobrazení počtu aktivních instancí po zničení jedné instance
print(Auto.pocet_instanci)  # 1

Třídní atribut pocet_instanci je inicializován na hodnotu 0.
Když je vytvořena nová instance třídy Auto (v konstruktoru __init__), počet instancí se zvýší o 1 pomocí Auto.pocet_instanci += 1.
Při zničení instance (například pomocí del auto1) je metoda __del__ volána a počet instancí se sníží o 1.

Odpovědět
2.12.2024 15:47
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Radek Feix
Člen
Avatar
Radek Feix:31. ledna 17:27

POZOR! Dnešní lekce vám ukáže statiku, tedy
postupy, které v podstatě narušují objektový model. OOP je obsahuje jen pro
speciální případy a obecně platí, že vše jde napsat bez
statiky. Vždy musíme pečlivě zvážit, zda statiku opravdu
nutně potřebujeme. Obecné doporučení je statiku vůbec
NEPOUŽÍVAT. Proč to tady je? ještě dvě lekce. WTF

 
Odpovědět
31. ledna 17:27
Avatar
Jan černý
Člen
Avatar
Jan černý:27. února 17:17

když je na začátku napsáno nepoužívejte to! ale v předchozích lekcí to bylo běžně v kódech, bez vysvětlení. Pak relativně užitečné věci ke je vlastně super to použít na denní bázi.
z toho by byl jeden trochu zmaten tak používat nebo nepoužívat.

když jde kód napsat bez statiky jak se tedy bez statiky řeší to číslování a tvoření hesla ?

Editováno 27. února 17:19
 
Odpovědět
27. února 17:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jan černý
DarkCoder:27. února 20:32

Sdělení o tom to nepoužívat naprosto ignoruj. Používání třídních atributů je v mnoha ohledech výhodné. Ať už sdílení nějaké konfigurace napříč všemi instancemi. Použití třídního atributu může zjednodušit správu těchto hodnot. Dále výkonová optimalizace. Třídní atributy šetří paměť, protože se ukládají pouze jednou pro celou třídu na rozdíl od instančních atributů, které jsou uložené pro každou instanci objektu. Pro konstantní hodnoty, jež jsou neměnné instancemi.

Je třeba mít na vědomí, že třídní atributy mohou být přístupné a měnitelné zvenčí, což může vést k neúmyslným změnám stavu objektu. V konečném důsledku záleží na konkrétním případě a designu třídy. Když jsou používány správně, třídní atributy mohou výrazně zjednodušit kód.

Odpovědět
27. února 20:32
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 35.