2016-09-15 60 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

這是失敗,因爲a1 + a2返回一個int實例和它的__add__被稱爲不支持添加自定義類A;你可以在__add__返回A實例來消除這種具體操作異常:

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 

該類當然從同樣的問題受到影響與其他業務;你需要實現其他的dunders來返回你的類的實例,否則你會碰到與其他操作相同的結果。

如果你想有一個很好的結果顯示,當你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

Thanks.But我想通過給a1 + a2 + a3得到結果,而不是在外部使用value屬性。 –

0

問題是,

a1 + a2 + a3 給出 30 + a3

30是一個整數,而整數不知道如何總結到一個

你應該在你__add__函數返回一個實例