Przeciążanie operatora równości
Gdy porównujesz dwa obiekty klasy niestandardowej za pomocą ==, Python domyślnie porównuje jedynie referencje do obiektów, a nie dane w nich zawarte. Aby zmienić to zachowanie, klasa może implementować specjalną metodę __eq__(), która przyjmuje dwa argumenty -- porównywane obiekty -- i zwraca True lub False. Metoda ta jest wywoływana niejawnie podczas porównywania dwóch obiektów.
Klasa BankAccount z poprzedniego rozdziału jest dostępna w panelu skryptu. Ma jeden atrybut, balance, oraz metodę withdraw(). Dwa konta bankowe z tym samym saldem niekoniecznie są tym samym kontem – konto bankowe ma jednak zazwyczaj numer konta, a dwa konta o tym samym numerze powinny być traktowane jako identyczne.
To ćwiczenie jest częścią kursu
Programowanie obiektowe w Pythonie
Instrukcje do ćwiczenia
Zaznacz kod w liniach 1–7 i naciśnij przycisk „Uruchom kod". Następnie utwórz kilka obiektów BankAccount w konsoli i porównaj je ze sobą.
- Zmodyfikuj metodę
__init__(), aby przyjmowała nowy parametr –number– i inicjalizowała nowy atrybutnumber. - Zdefiniuj metodę
__eq__(), która zwracaTrue, jeśli atrybutnumberdwóch obiektów jest równy. - Przeanalizuj instrukcje print i wyniki wyświetlone w konsoli.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
class BankAccount:
# MODIFY to initialize a number attribute
def __init__(self, balance=0):
self.balance = balance
def withdraw(self, amount):
self.balance -= amount
# Define __eq__ that returns True if the number attributes are equal
def ____(____, ____):
return ____.number == ____.____
# Create accounts and compare them
acct1 = BankAccount(123, 1000)
acct2 = BankAccount(123, 1000)
acct3 = BankAccount(456, 1000)
print(acct1 == acct2)
print(acct1 == acct3)