Jak funguje speciální metoda __eq__ ? – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak funguje speciální metoda __eq__ ? – Python – Fórum – Programujte.comJak funguje speciální metoda __eq__ ? – Python – Fórum – Programujte.com

 

Váchyč0
Duch
12. 7. 2018   #1
-
0
-

Zdravím vás! Naučil jsem se pracovat se speciálními metodami u tříd, je to super. Představte si, že budete chtít testovat rovnost dvou různých datových typů, v mém kódu jde o porovnání čísel. (další text je pod kódem)

class zt:

    def __init__(self, cislo = "0"):
        self.cislo = cislo

    def __eq__(self, cislo):
        return int(self.cislo) == cislo

zt1 = zt()

Já do té metody __eq__ píšu argumenty nejdřív self, jakožto odkaz na instanci té třídy a druhý argument je >cislo< , což má být číslo typu int . Otázka: Když mám v pořadí vždycky hned self a po něm něco jiného, musím u testování rovnosti také nejdřív používat instanci té třídy (třeba zt1 == 0) nebo si můžu dovolit pořadí operandů prohodit? (0 == zt1)

Mně to funguje i s tím prohozením, ale jasno nemám v tom, jestli na tom pořadí argumentů záleží nebo ne. Víte, co tím myslím? Když napíšu 0 == zt1, zavolá se metoda __eq__ u té nuly, jakožto u instance třídy int nebo __eq__ u instance třídy zt?

Nahlásit jako SPAM
IP: 94.230.156.–
gna
~ Anonymní uživatel
1891 příspěvků
12. 7. 2018   #2
-
0
-

Nejsem si jistý, co myslíš tím pořadím argumentů. Self nemá žádný speciální význam, prostě první parametr metody je objekt, na kterém byla zavolána a je zvykem ho pojmenovávat self (a druhý parametr porovnávacích metod zase other).

Co se týče toho fungování, tak jen v případě, že porovnáváš instanci třídy s instancí třídy z ní odvozené, tak má přednost odvozená třída. Jinak má přednost to, co je nalevo. 

# stejne typy
a1 == a2  # a1.__eq__(a2)
a2 == a1  # a2.__eq__(a1)
# rozdilne typy
a == b    # a.__eq__(b)
b == a    # b.__eq__(a)
# aa je instance odvozene tridy
a == aa   # aa.__eq__(a)
aa == a   # aa.__eq__(a)

Důležité je to slovo přednost. Ta porovnávací metoda může vrátit NotImplemented a v tom případě se zkusí druhá možnost.

zt1 == 0  # zt1.__eq__(0)
0 == zt1  # 0.__eq__(zt1)
          # == NotImplemnted
          # => zt1.__eq__(0)

Pokud obě možnosti vrátí NotImplemented, tak se porovná identita objektů (jestli je to ten samý objekt, jako operátor is).

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý