14

Python docsによると、「を定義するときは、演算子が期待どおりに動作するように__eq__()定義する必要があります」。__ne__()

ただし、Pythonは次__ne__のようにnot __eq__自動的に計算するようです。

In [8]: class Test:
    def __eq__(self, other):
        print("calling __eq__")
   ...:         return isinstance(other, Test)
   ...:

In [9]: a = Test()

In [10]: b = Test()

In [11]: a == b
calling __eq__
Out[11]: True

In [12]: a != b
calling __eq__
Out[12]: False

In [13]: a == 1
calling __eq__
Out[13]: False

In [14]: a != 1
calling __eq__
Out[14]: True

__ne__では、それが単に になるかどうかを定義するポイントは何return not self.__eq__(other)ですか? さらに、この動作は実際にどこに文書化されていますか?

編集

どうやら私がPython 3を使用していることは重要です.Python 2では、私は

In [1]: class Test(object):
   ...:     def __eq__(self, other):
   ...:         print("calling __eq__")
   ...:         return isinstance(other, Test)
   ...:

In [2]: a = Test()

In [3]: b = Test()

In [4]: a == b
calling __eq__
Out[4]: True

In [5]: a != b
Out[5]: True

In [6]: a == 1
calling __eq__
Out[6]: False

In [7]: a != 1
Out[7]: True

しかし、私が参照したドキュメントは Python 3 ドキュメントです。更新されていないだけですか?

4

1 に答える 1

16

==Python 3 では、ケースの動作が変更されました。 Python 3, What's Newを参照してください。

!===を返さない限り、 の反対を返すようになり==ましたNotImplemented

これは有用な変更と見なされました。

ドキュメントが更新されていないという事実は、確かに長年のバグです。

ただし、レポートのコメントが指摘しているように、すでに定義されているクラスから継承する場合__ne__、オーバーライドするだけ__eq__では不十分であり、__ne__メソッドもオーバーライドする必要があります。

于 2014-06-27T15:55:30.993 に答える