テーマ
私は普段Djangoを用いてCDPの開発を行っています。
そこで遭遇した__eq__
メソッドについて調べたので備忘録として記載します。
環境
バージョン | |
---|---|
Django | 3.1.1 |
Python | 3.8 |
※バージョン自体少し古めです。。。
__eq__メソッドとは
__eq__
メソッドとは、Pythonに標準で用意されている特殊メソッドのことです。
よく使用されるものは下記のようなものがあります。
-
__init__
→ クラスの初期化に使用 -
__str__
→ クラスオブジェクトを文字列で表示
上記の他にも多くの特殊メソッドが存在します。
では、__eq__
はどういったメソッドなのでしょうか。
結論から言うと、クラスオブジェクトを何によって等価であるとみなすかを設定するメソッドです。
通常オブジェクトを比較する場合、下記のようにメモリアドレスから判断します。
class Person:
def __init__(self, first_name: str, last_name: str) -> None:
self.first_name = first_name
self.last_name = last_name
if __name__ == "__main__":
person1 = Person("taro", "tanaka")
person2 = Person("taro", "tanaka")
print(person1) # => <__main__.Person object at 0xffffb0c33a90>
print(person2) # => <__main__.Person object at 0xffffb0c33810>
print(person1 == person2) # => False
もちろん上記の通りperson1 == person2
はFalse
なります。
0xffffb0c33a90
がメモリアドレスとなっており、Pythonはこのメモリアドレスの値によってオブジェクトが同じかどうかを判断します。
今回の場合、0xffffb0c33a90
と0xffffb0c33810
は異なっているため判定はFalse
になります。
しかし、下記のように__eq__
メソッドで等価の条件を設定すると
from __future__ import annotations
class Person:
def __init__(self, first_name: str, last_name: str) -> None:
self.first_name = first_name
self.last_name = last_name
def __eq__(self, other: Person) -> bool:
return self.first_name == other.first_name and self.last_name == other.last_name
if __name__ == "__main__":
person1 = Person("taro", "tanaka")
person2 = Person("taro", "tanaka")
print(person1) # => <__main__.Person object at 0xffffb0c33a90>
print(person2) # => <__main__.Person object at 0xffffb0c33810>
print(person1 == person2) # => True
上記のように作成されたオブジェクトのメモリアドレスは異なっているが、first_name
とlast_name
が同じなので等価であるとみなされます。
このようにメモリアドレスではなく、等価の条件を決めることができます。
まとめ
いかがだったでしょうか。
Pythonは今回のような特殊メソッドがそれなりに多く存在するので都度調べながら開発しています。
もし実務で知らない特殊メソッドが再度出てきたら備忘録として記載したいと思います。
最後まで読んでいただいて有難うございました!
これからももっと技術に強いエンジニアを目指します!