2016-11-15 27 views
0

我正在爲一個班級重載__iadd__魔法,除非我自己回​​來,否則會失敗,並且出現錯誤,我不能添加NoneTypestr。我可以從錯誤推斷,因爲我不返回self,隱式返回的None不能被添加。我正在執行一個就地更換的高手,所以我對引擎蓋下發生的事情更感興趣。下面是增加了字典對象列表的樣品的方法:爲什麼有必要在魔術方法重載中返回「自我」?

class StageChanges(LeverObject): 
    def __init__(self): 
     super().__init__('stage_changes') 
     self.stage_changes = [] 

    def __iadd__(self, other): 
     self.stage_changes.extend(other) 
     return self 
+0

壓倒你的意思?編輯:nvm它足夠清楚你的意思 –

回答

4

由於文檔說:

這些方法[在__i*__方法]被稱爲實現增強算術任務(+ =, - =,* =,/ =,// =,%=,** =,< < =,>> =,& =,^ =,| =)。這些方法應該嘗試就地操作(修改自我)並返回結果(可能是,但不一定是自己)。

他們不必返回self,但他們必須返回結果,因爲該結果然後被分配回等號左側的目標。換句話說,__iadd__(x, y)必須返回x+y的結果,就像__add__(x, y)必須返回x+y的結果。這只是__iadd__可能,此外變異的左手操作數,如果它想。

或者,您無疑會看到如果您在尋找其他相關問題,x += y並不像有些人認爲的那樣相當於x.__iadd__(y)。它相當於x = x.__iadd__(y)

1

x += y中,即使x支持__iadd__,也不假定x在操作後仍然是同一個對象。 __iadd__可以選擇返回x的新對象,該對象可能是None。爲了消除歧義,如果x仍然是self,則__iadd__必須返回self

相關問題