Перегрузка оператора равенства
Когда вы сравниваете два объекта пользовательского класса с помощью ==, 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)