Zacznij terazZacznij za darmo

Sprawdzanie równości klas

W poprzednim ćwiczeniu zdefiniowano klasę BankAccount z atrybutem number, który był używany do porównań. Gdybyś jednak porównał obiekt BankAccount z obiektem innej klasy, która również ma atrybut number, możesz otrzymać nieoczekiwane wyniki.

Rozważ na przykład dwie klasy:


class Phone:
  def __init__(self, number):
     self.number = number

  def __eq__(self, other):
    return self.number == \
          other.number

pn = Phone(873555333)

class BankAccount:
  def __init__(self, number):
     self.number = number

  def __eq__(self, other):
    return self.number == \
           other.number

acct = BankAccount(873555333)

Wykonanie acct == pn zwróci True, mimo że porównujemy numer telefonu z numerem konta bankowego.

Dobrą praktyką jest sprawdzanie klasy obiektów przekazywanych do metody __eq__(), aby mieć pewność, że porównanie ma sens.

To ćwiczenie jest częścią kursu

Programowanie obiektowe w Pythonie

Zobacz kurs

Instrukcje do ćwiczenia

Obie klasy – Phone i BankAccount – są już zdefiniowane. Uruchom kod w obecnej postaci, klikając przycisk "Uruchom kod", i sprawdź wynik.

  • Zmodyfikuj definicję klasy BankAccount tak, aby zwracała True tylko wtedy, gdy atrybut number jest taki sam i gdy type() obu przekazanych obiektów jest identyczny.

Uruchom kod ponownie i sprawdź wynik.

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

class BankAccount:
    def __init__(self, number, balance=0):
        self.number, self.balance = number, balance
      
    def withdraw(self, amount):
        self.balance -= amount 

    # MODIFY to add a check for the type()
    def __eq__(self, other):
        return (self.number == other.number)

acct = BankAccount(873555333)
pn = Phone(873555333)
print(acct == pn)
Edytuj i uruchom kod