Перевантаження оператора рівності
Під час порівняння двох об'єктів користувацького класу за допомогою == Python типово порівнює лише посилання на об'єкти, а не дані всередині них. Щоб змінити цю поведінку, у класі можна реалізувати спеціальний метод __eq__(), який приймає два аргументи — об'єкти для порівняння — і повертає True або False. Цей метод буде неявно викликано під час порівняння двох об'єктів.
Клас BankAccount з попереднього розділу доступний у вікні сценарію. Він має один атрибут balance і метод withdraw(). Два банківські рахунки з однаковим балансом — це не обов'язково один і той самий рахунок, але банківський рахунок зазвичай має номер рахунку, і два рахунки з однаковим номером рахунку слід вважати однаковими.
Ця вправа є частиною курсу
Об'єктноорієнтоване програмування в Python
Інструкції до вправи
Спробуйте виділити код у рядках 1–7 і натиснути кнопку "Run code". Потім створіть кілька об'єктів BankAccount у консолі та порівняйте їх.
- Змініть метод
__init__(), щоб він приймав новий параметрnumberі ініціалізував новий атрибутnumber. - Визначте метод
__eq__(), який повертаєTrue, якщо атрибутиnumberу двох об'єктів рівні. - Перегляньте оператори print та вивід у консолі.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
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)