为什么有必要在魔术方法重载中返回“self”?

时间:2016-11-15 21:38:00

标签: python

我正在为一个类重载__iadd__魔法方法,除非我返回self,否则会因为我无法添加NoneTypestr而导致失败。我可以从错误中推断出因为我没有返回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

2 个答案:

答案 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