Tworzenie i używanie funkcji __lt__ i __eq__ python

0

Mam pytanie na temat owych funkcji

def __lt__(self)
def __eq__(self)
itp...

Większość informacji o nich jest po angielsku i nie jest dla mnie do końca jasne ich zastosowanie, a może nawet bardziej sposób tworzenia. Czy mógłby ktoś podać jakiś konkretny przykład użycia tych dwóch funkcji?

0

Ot, garść operatorów.

class Foo:
    def __lt__(self, whatever):
        print('<')
    def __eq__(self, whatever):
        print('==')
        
Foo() == 5
Foo() < 3

http://ideone.com/KJx9F8

1

Operatory:
lt - less than
gt - greater than
eq - equals

Przykład, jak już je zaimplementujesz:

foo = Foo()  # jakaś klasa z tymi metodami zaimplementowanymi

foo.__lt__(453)
# to to samo co:
foo < 453

foo.__eq__(5)
# to to samo co:
foo == 5
0

Ok, mam taką klasę https://ideone.com/dIrU1L chciałbym żeby te dwie funkcje lt i eq sprawdzały czy prostokąt będzie mniejszy polem od innego prostokąta, nadal nie rozumiem działania tych funkcji bo jak widać mam w nich błędy ale nie wiem jak to zmienić żeby było dobrze..

0

Jakie błędy? U mnie działa.

0

Mam ten kod i podaję następujące dane

p1 = Prostokat(3, 3)
print p1.__lt__(6)

a to z kolei zwraca mi taki błąd

Traceback (most recent call last):
  File "D:/.../plik.py", line 160, in <module>
    print p1.__lt__(6)
  File "D:/.../plik.py", line 153, in __lt__
    return self.a * self.b < other.a * other.b
AttributeError: 'int' object has no attribute 'a'
2

Napisałeś: "sprawdzały czy prostokąt będzie mniejszy polem od innego prostokąta", a porównujesz z liczbą, a nie innym prostokątem.

p1 = Prostokat(3, 3)
p2 = Prostokat(6 ,7)
p1 < p2  # zwraca True

Jak chcesz porównywać to w taki sposób: p1 < 6 to musiałbyś sprawdzać w metodzie __lt__ typ parametru other i zależnie od typu porównywać. Jednak jest to IMO zły pomysł i nie powinieneś tego robić. Zamiast tego po prostu porównuj pole:

p1.pole() < 6
0

Okej dzięki, chyba wyłączyłem myślenie.. :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1