始める無料で始める

クラスの等価性を確認する

前の演習では、number 属性を比較に使う BankAccount クラスを定義しました。しかし、もし別のクラスにも number 属性があり、それと BankAccount オブジェクトを比較すると、思わぬ結果になることがあります。

たとえば、次の2つのクラスを考えます。


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)

acct == pn を実行すると、電話番号と銀行口座番号を比較しているにもかかわらず、True が返ります。

__eq__() メソッドに渡されるオブジェクトのクラスを確認し、比較が妥当かどうかを確かめることは良い習慣です。

この演習はコースの一部です

Python によるオブジェクト指向プログラミング

コースを見る

演習の手順

PhoneBankAccount の両クラスは定義済みです。まずは「コードを実行する」ボタンでそのまま実行し、出力を確認してください。

  • BankAccount の定義を修正し、number 属性が同じであることに加えて、渡された両オブジェクトの type() も同じ場合にのみ True を返すようにしてください。

もう一度コードを実行し、出力を確認しましょう。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

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)
コードを編集して実行