1. ホーム
  2. python

[解決済み] Pythonで__eq__はどのように処理され、どのような順序で処理されるのですか?

2022-03-14 17:57:47

質問

Pythonは比較演算子の左バージョンと右バージョンを提供していないので、どのように呼び出すべき関数を決定するのでしょうか?

class A(object):
    def __eq__(self, other):
        print "A __eq__ called"
        return self.value == other
class B(object):
    def __eq__(self, other):
        print "B __eq__ called"
        return self.value == other

>>> a = A()
>>> a.value = 3
>>> b = B()
>>> b.value = 4
>>> a == b
"A __eq__ called"
"B __eq__ called"
False

これは __eq__ 関数を使用します。

公式のデシジョンツリーを探しています。

どのように解決するのですか?

その a == b を呼び出します。 A.__eq__ が存在するためです。 そのコードには self.value == other . intはBと自分自身を比較する方法を知らないので、Pythonは試しに B.__eq__ と比較して、自分自身とintを比較する方法を知っているかどうかを確認します。

どのような値が比較されているのかがわかるようにコードを修正すると。

class A(object):
    def __eq__(self, other):
        print("A __eq__ called: %r == %r ?" % (self, other))
        return self.value == other
class B(object):
    def __eq__(self, other):
        print("B __eq__ called: %r == %r ?" % (self, other))
        return self.value == other

a = A()
a.value = 3
b = B()
b.value = 4
a == b

と表示されます。

A __eq__ called: <__main__.A object at 0x013BA070> == <__main__.B object at 0x013BA090> ?
B __eq__ called: <__main__.B object at 0x013BA090> == 3 ?