2015-12-31 10 views
19
class L(object): 
    def __eq__(self, other): 
     print 'invoked L.__eq__' 
     return False 

class R(object): 
    def __eq__(self, other): 
     print 'invoked R.__eq__' 
     return False 

left = L() 
right = R() 

、左側は、データモデルでdocumentedとして、比較の最初のショットを取得します。Pythonの平等の優先順位

>>> left == right 
invoked L.__eq__ 
False 

しかし、私たちはライン6(他のすべての若干の変更を加えた場合同じ):

class R(L): 

側は、比較の最初のショットを持って取得します。

>>> left == right 
invoked R.__eq__ 
False 

なぜですか?それはどこに文書化されていますか、そしてその意思決定の理由は何ですか?

答えて

18

これは、それがそのように動作理由の説明で、さらにページの下、numeric operationsの下で文書化されています

注:右オペランドの型は、左オペランドの型のサブクラスで、そのサブクラスである場合オペレーションに反映されたメソッドを提供します。このメソッドは、左オペランドの非反映メソッドの前に呼び出されます。この動作により、サブクラスは先祖操作をオーバーライドできます。

Python 3 documentationは、さらにあなたが見ていたセクションでそれに言及:オペランドが異なったタイプのものであり、右オペランドの型は、左オペランドの型の直接または間接のサブクラスである場合は、

右オペランドの反映されたメソッドが優先され、そうでない場合は左オペランドのメソッドが優先されます。仮想サブクラス化は考慮されません。

関連する問題