1
0

More than 1 year has passed since last update.

Djangoの開発で突如出てきた__eq__メソッドとは

Posted at

テーマ

私は普段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 == person2Falseなります。

0xffffb0c33a90がメモリアドレスとなっており、Pythonはこのメモリアドレスの値によってオブジェクトが同じかどうかを判断します。

今回の場合、0xffffb0c33a900xffffb0c33810は異なっているため判定は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_namelast_nameが同じなので等価であるとみなされます。

このようにメモリアドレスではなく、等価の条件を決めることができます。

まとめ

いかがだったでしょうか。

Pythonは今回のような特殊メソッドがそれなりに多く存在するので都度調べながら開発しています。

もし実務で知らない特殊メソッドが再度出てきたら備忘録として記載したいと思います。

最後まで読んでいただいて有難うございました!

これからももっと技術に強いエンジニアを目指します!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0