我正在为一个类重载__iadd__
魔法方法,除非我返回self,否则会因为我无法添加NoneType
和str
而导致失败。我可以从错误中推断出因为我没有返回self
,所以无法添加隐式返回的None
。我正在执行一个就地改变,因此我对发生在幕后的事情更感兴趣。这是一个添加dict对象列表的示例方法:
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 :(得分:4)
因为文档说:
调用这些方法[
on update
方法]来实现增强算术赋值(+ =, - =,* =,/ =,// =,%=,** =,<< =,>> =,& =,^ =,| =)。这些方法应该尝试就地执行操作(修改self)并返回结果(可能是,但不一定是自己)。
他们不必返回__i*__
,但他们必须返回结果,因为该结果会被分配回等号左侧的目标。换句话说,self
必须返回__iadd__(x, y)
的结果,就像x+y
必须返回__add__(x, y)
的结果一样。它只是x+y
可以,另外如果想要改变左手操作数。
或者,因为您毫无疑问地看到您是否在寻找其他问题,__iadd__
并非如某些人所认为的那样,等同于x += y
。它相当于x.__iadd__(y)
。
答案 1 :(得分:1)
在x += y
中,即使x
支持__iadd__
,也不会假定x
在操作后仍然是同一个对象。 __iadd__
可以选择为x
返回一个新对象,该对象可以是None
。要取消歧义,__iadd__
必须返回self
,如果x
仍然是self
。