НачатьНачать бесплатно

Перегрузка оператора равенства

Когда вы сравниваете два объекта пользовательского класса с помощью ==, Python по умолчанию сравнивает ссылки на объекты, а не данные, которые в них хранятся. Чтобы изменить это поведение, в классе можно реализовать специальный метод __eq__(). Он принимает два аргумента — сравниваемые объекты — и возвращает True или False. Этот метод вызывается неявно при каждом сравнении двух объектов.

Класс BankAccount из предыдущей главы уже доступен в панели с кодом. У него есть один атрибут — balance — и метод withdraw(). Два банковских счёта с одинаковым балансом не обязательно являются одним и тем же счётом. Однако у каждого счёта обычно есть номер, и два счёта с одинаковым номером следует считать одним и тем же счётом.

Это упражнение является частью курса

Объектно-ориентированное программирование на Python

Посмотреть курс

Инструкции к упражнению

Выделите код в строках 1–7 и нажмите кнопку «Запустить код». Затем создайте несколько объектов BankAccount в консоли и сравните их.

  • Измените метод __init__(), добавив новый параметр number, и инициализируйте соответствующий атрибут number.
  • Определите метод __eq__(), который возвращает True, если атрибуты number двух объектов совпадают.
  • Изучите операторы вывода и результат в консоли.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

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)
    
Редактировать и запускать код