2016-09-15 5 views
1

私は以下の方法でPythonで単純な演算子のオーバーロードを行うことができます。複数のオペランドを使ったPython演算子のオーバーロード

「+」演算子をオーバーロードするとしましょう。

class A(object): 
    def __init__(self,value): 
    self.value = value 

    def __add__(self,other): 
    return self.value + other.value 

a1 = A(10) 
a2 = A(20) 
print a1 + a2 

しかし、私は次の手順を実行しようとすると、それは失敗し、

a1 = A(10) 
a2 = A(20) 
a3 = A(30) 
print a1 + a2 + a3 

__add__のみ2つのパラメータを受け付けますので。オペランドのオーバーロードをn個のオペランドで実現する最適なソリューションは何ですか?

答えて

2

カスタムクラスAと追加をサポートしていないintインスタンスを返し、その__add__が呼び出されa1 + a2ので、これは失敗です。

class A(object): 
    def __init__(self,value): 
    self.value = value 

    def __add__(self,other): 
    return type(self)(self.value + other.value) 

は今、それらを一緒に追加する期待通りに動作します:

>>> a1 = A(10) 
>>> a2 = A(20) 
>>> a3 = A(30) 
>>> print(a1 + a2 + a3) 
<__main__.A object at 0x7f2acd7d25c0> 
>>> print((a1 + a2 + a3).value) 
60 

もちろんこのクラスは、同じ問題に苦しんでいるあなたは、この特定の操作のための例外を排除するために__add__Aインスタンスを返すことができます他の操作と;クラスのインスタンスを返すために他のダンダーを実装する必要があります。そうしないと、他の操作で同じ結果にぶつかります。

あなたは素敵な結果があなたprintこれらのオブジェクト、あなたはまた、呼び出されたときに値を返すために__str__を実装する必要があるときに表示したい場合:

class A(object): 
    def __init__(self,value): 
     self.value = value 

    def __add__(self,other): 
     return A(self.value + other.value) 

    def __str__(self): 
     return "{}".format(self.value) 

は今、印刷はあなたが必要とする効果があります。

>>> print(a1 + a2 + a3) 
60 
+1

なぜ_temporarily_に合計する方法がわかりませんか?私にとって適切な解決策のように見えます。 –

+0

は一時的に間違った単語かもしれませんが、これは特定の操作の問題を修正しますが、必要な操作をすべて実装していないと、一般的には奇妙な結果になります。 –

+0

ありがとうございました。私は、単にa1 + a2 + a3を与えるだけで結果を得たいと考えていました。 –

0

問題はです

a1 + a2 + a3

30 10はintであり、int型は、あなたがあなたの__add__関数内でAのインスタンスを返す必要があり

関連する問題