2016-11-15 58 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

相关问题