2016-10-05 19 views
1

実行時に演算子をオーバーロードすることは可能ですか?私は次のコード例を試しました:実行時のオーバーロード演算子

class A(): 
    pass 
a = A() 
a.__eq__ = lambda self, other: False 
a == a # this should return False since the __eq__-method should be overloaded but it returns 
     # True like object.__eq__ would 
a.__eq__(a, a) # this returns False just as expected 

なぜこのコードは動作しませんか?望ましい行動を達成することは可能ですか?

+3

IIRC、 " dunder "メソッドは常にインスタンスではなく_class_で検索されます。 – mgilson

+0

@mgilsonが正しく、 'A .__ eq__'に代入してみてください – jonrsharpe

答えて

2

マジック/ダブルアンダースコアのメソッドは、インスタンスではなくクラスで検索されます。したがって、インスタンスではなくクラスのメソッドをオーバーライドする必要があります。これを行うには2つの方法があります。

どちらかが直接のようなクラスに割り当てる:

class A: 
    pass 

a = A() 
A.__eq__ = lambda self, other: False 
print(a == a) 
print(a.__eq__(a)) # You're already passing in self by calling it as an instance method, so you only pass in the other one. 

それともあなたが唯一のインスタンスを持っていて、3.xを使用している場合、あなたが行うことができます。特別な

class A: 
    pass 

a = A() 
type(a).__eq__ = lambda self, other: False 
print(a == a) 
print(a.__eq__(a)) 
+0

素晴らしいですが、.__ eq __(a)を実行しようとするとエラーが出るので、演算子メソッドを呼び出したときに" self "よくTypeError:eq()に1つの必須の位置引数がありません:other。おそらくpython2とpython3の違いはありますか? –

+0

2.7.11で動作します。 https://ideone.com/vsumsI –

+0

それでは、2と3の違いは、私が言ったように、これはPython 3では動作しません。そのため、自己引数をメソッドに渡す必要があります。 –

関連する問題