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 20 - Magické metody v Pythonu

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
Daniel Zábojník:31.10.2023 11:26

Děkujeme za vaše podněty. Lekci jsme přepracovali :-)

 
Odpovědět
31.10.2023 11:26
Avatar
Elvíra Krieger:21.3.2024 23:23

Chtělo by to vysvětlit vyvolávání výjimek, nebo aspoň odkázat někam na vysvětlení. A ukázkové kódy jsou na pochopení fakt hodně složité, ty, které jsou v druhé lekci ve shrnutí, by asi byly pro první ukázku výrazně pochopitelnější a přehlednější

Odpovědět
21.3.2024 23:23
Every first draft is perfect because all the first draft has to do is exist. It's perfect in its existence. The ...
Avatar
Jean Kocman :3.12.2024 21:30

aaaa co jsem komu udělal! Tohle je víc a víc horší.

 
Odpovědět
+2
3.12.2024 21:30
Avatar
Veronika Viková:22. dubna 18:56

Někde jsem se ztratila a nemohu najít cestu :-(. Z výkladu to vůbec nechápu. Vůbec nevím k čemu je přetížení operátoru a proč to potřebuji, asi mi někde něco uniklo.

 
Odpovědět
22. dubna 18:56
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Veronika Viková
DarkCoder:22. dubna 19:33

Přetížení operátoru umožňuje definovat, jak se budou běžné operátory chovat pro tvé vlastní třídy. Díky tomu se můžeš chovat k instancím svých tříd podobně jako k běžným typům.

Příklad na přetížení operátoru + pro třídu Vector aby si mohla sčítat dva vektory:

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

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

# Ukázka použití
v1 = Vector(2, 3)
v2 = Vector(4, 1)
v3 = v1 + v2

print(v3)  # Výstup: Vector(6, 4)

__add__ je speciální metoda (tzv. dunder method), kterou Python zavolá, když použiješ +.

v1 + v2 ve skutečnosti volá v1.__add__(v2).

Výsledkem je nový objekt typu Vector, který má součet souřadnic x a y.

__repr__ je speciální metoda, která určuje, jak se objekt zobrazí, když ho vypíšeš (např. pomocí print()), nebo když ho vidíš v konzoli/interpretu. Má za cíl vrátit reprezentaci objektu

Odpovědět
+1
22. dubna 19:33
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Veronika Viková
DarkCoder:22. dubna 19:43

Můžeš to pochopitelně napsat i bez přetížení:

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

    def add(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(2, 3)
v2 = Vector(1, 4)
v3 = v1.add(v2)
print(v3)  # Vector(3, 7)

S přetížením +

v3 = v1 + v2

Obojí dělá totéž, jen varianta s přetížením vypadá přirozeněji

Přetížení operátorů je o pohodlí a čitelnosti. A použiješ to tehdy když chceš, aby se tvoje objekty chovaly jako běžné typy. Přetížení operátorů není povinné, ale může být v mnoha ohledech elegantní a užitečné.

Odpovědět
+1
22. dubna 19:43
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Veronika Viková:22. dubna 19:46

Děkuji za vysvětlení.

 
Odpovědět
22. dubna 19:46
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 7 zpráv z 37.