Pythonの__eq__メソッドでインスタンス変数を比較してみます。
■Python
Google Colaboratory(Google Colab),2023年3月18日時点ではPython 3.9.16が用いられる。
■__eq__メソッドでインスタンス変数を比較する
では、早速__eq__メソッドでインスタンス変数を比較するコードを書いていきます。
■コード
class Fruit: def __init__(self, name, color): self.name = name self.color = color def __eq__(self, other): if isinstance(other, Fruit): return self.name == other.name and self.color == other.color else: return False apple = Fruit("apple", "red") orange = Fruit("orange", "orange") if apple == orange: print("同じ果物です") else: print("違う果物です")
Fruitというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2,第3の引数,パラメータとして「name, color」をそれぞれ設定します。なお、最初の「self(自己)」という引数,パラメータを介して、「name, color」という2つのクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いてname, colorの2つを指定します。
次にクラス内にdef文を用いて’__eq__’と記述し、特殊なメソッドを使います。これはselfとotherの値が等しいかを比較することができます。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとして「other」を設定します。なお、「other」は比較対象となるオブジェクトのインスタンス自体(クラスから生成された実際のデータ)を表している。
次に’__eq__’メソッド内にif文を用いてisinstance()を使うようにします。このメソッドは、オブジェクトのデータ型を判定するものです。括弧内には、第1の引数,パラメータとして「other」を設定します。第2の引数,パラメータとして「Fruit」を設定します。そして、このメソッドが呼び出されたときの処理として、2つのインタンス変数であるself.name、self.ageに割り当てた値が、other.x、other.yに割り当てた値(クラスから生成された実際のデータで、データには属性を持ちその値)と等しいかを等価演算子”==”を用いた処理を行います。もし異なる場合はelse節でreturnとしてFalseを返します。
メソッドを定義後、apple,orangeという変数を用意し、その中にそれぞれFruit()を格納し、インスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。そこで、先ほどの2つの引数,パラメータであるname,colorに値を渡すために、括弧内に値をそれぞれ記述します。これで’__init__’内でself.name、self.colorに値が割り当てられます。
最後にifとelseを使って作成した2つのapple,orangeというオブジェクトを、等価演算子”==”を使用し比較します。今回の場合では、appleとorangeは異なるオブジェクトであるため、Falseが返されます。
■実行・検証
このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。
実行してみると、クラスを定義しクラス内にインスタンス変数を作り、作ったインタンス変数を’__eq__’メソッドを用いて比較し、最後にifとelseを用いて作成した2つのオブジェクトを、等価演算子”==”を使用し比較。比較後、比較された結果を出力させることができました。
コメント