等価演算子のオーバーロード
カスタムクラスの2つのオブジェクトを == で比較すると、Python はデフォルトではオブジェクトの参照だけを比較し、オブジェクトに含まれるデータは比較しません。この挙動を上書きするには、クラスで特別メソッド __eq__() を実装します。これは2つの引数(比較するオブジェクト)を受け取り、True または False を返します。2つのオブジェクトが比較されると、このメソッドが暗黙的に呼び出されます。
前の章で扱った BankAccount クラスがスクリプトペインに用意されています。属性は balance が1つと、withdraw() メソッドがあります。同じ残高でも口座自体が同一とは限りませんが、銀行口座には通常「口座番号」があり、口座番号が同じであれば同じ口座と見なすべきです。
この演習はコースの一部です
Python によるオブジェクト指向プログラミング
演習の手順
まずは1〜7行目のコードを選択して「"Run code"」ボタンを押してみてください。続いて、コンソールでいくつかの BankAccount オブジェクトを作成し、比較してみましょう。
__init__()メソッドを修正して、新しい引数numberを受け取り、新しい属性numberを初期化します。- 2つのオブジェクトの
number属性が等しければTrueを返す__eq__()メソッドを定義します。 - 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)