2017-08-09 10 views
0

カスタムクラスの2つのオペランドの演算子オーバーライドのしくみを理解しようとしています。例えばPythonの同じクラスオペランドの可換操作のオーバーライド

、私は次のようしているとします

class Adder: 
    def __init__(self, value=1): 
     self.data = value 
    def __add__(self,other): 
     print('using __add__()') 
     return self.data + other 
    def __radd__(self,other): 
     print('using __radd__()') 
     return other + self.data 

私は、次の変数を初期化します。その後、

x = Adder(5) 
y = Adder(4) 

そして、次の操作を行うに進みます

1 + x 
using __radd__() 
Out[108]: 6 

x + 2 
using __add__() 
Out[109]: 7 

上記の2つの操作は厄介なようです。カスタムクラスのメンバが加算式の "+"の右側にある場合、__radd__が使用されます。左にある場合は、__add__が使用されます。 1つのオペランドがAdderタイプであり、もう1つが他のものである場合、これは式で機能します。あなたが見ることができるように両方のオペランドがカスタムクラスである場合、両方__add____radd__

x + y 
using __add__() 
using __radd__() 
Out[110]: 9 

と呼ばれています:私はこれを行うと

は、しかし、私は次のような結果を得ます。

私の質問は、この状況をどうやって解き、どのように右手追加機能と左利き追加機能の両方を呼び出すことができるかです。

+0

それは私の理解は '5 + y'をy .__ RADD __(5)' 'を呼び出すべきであるということですか? – MadPhysicist

答えて

1

これは、メソッド内でデータをotherに追加するためです。これはそれ自体がAdderのインスタンスです。したがって論理は次のようになります。

  • __add__
  • ああ、右側のオペランドが__radd__方法、Y上のよう
  • コール__radd__付きインスタンスであるY(加算器インスタンス)
  • x.data(int)を加えます。
  • y.data(別のint)にintを追加します。

通常は、otherがあなたのクラスのインスタンスがいたかどうかを確認するだろう、とあればこれだけではなく、otherother.dataを追加します。

1

__add____radd__メソッドを実装しても、Adderクラスのインスタンスに特別な処理が行われないためです。したがって、それぞれ__add__コールは、の整数プラス加算器インスタンスオペレーションにつながり、さらに右側のAdderインスタンスのために__radd__が必要です。

次の操作を行うことによってこの問題を解決することができます

def __add__(self, other): 
    print('using __add__()') 
    if isinstance(other, Adder): 
     other = other.data 
    return self.data + other 

def __radd__(self, other): 
    print('using __radd__()') 
    return self.__add__(other) 
+0

これは意味があります。あなたは、Pythonが整数の代わりに右側で 'Adder'のインスタンスに出会うと、それを整数にするためにいくつかのwodooの魔法をしますと言っていますか? – MadPhysicist

+0

@MadPhysicistそれを[magic](https://xkcd.com/628/)と呼ぶことはありません。最初の 'x .__ add __(y)'コールの後に '5 + y'がどのように解決されると思いますか? –

+0

それは私が混乱している部分です。どのように '__add__'を入力して、' a + b'型の式の答え全体を得ることなくそれから戻ることができますか? '__add__'はどうにかして最初のオペランドを解析し、それが' x = 5'であると判断し、 '__radd__'メソッドに' 5 + y'の結果をバウンスしますか? – MadPhysicist

関連する問題