不能在python类中使用iadd

时间:2013-07-08 19:07:58

标签: python class

我试图理解为什么我不能在自我对象的类中使用iadd(+ =)。

例如,如果我使用iadd定义一个类,并使用iadd(addA)定义一个函数:

class A(object):
    def __init__(self, n):
        self.n = n
    def __iadd__(self, other):
        return A(self.n+other.n)
    def addA(self, other):
        self+=other

a1 = A(9)
a2 = A(8)

如果我使用addA函数,a1似乎不会受到影响:

a1.addA(a2)
print a1.n
>>> 9

但是,如果我正常使用iadd,它可以正常工作:

a1+=a2
print a1.n
>>> 17

有人能告诉我如何在课程定义中使用iadd。

(希望这不相关,但我问这个,因为我正在尝试为maya.OpenMaya.MMatrix对象创建一个包装器 - 我想添加一个函数来应用任意转换。我需要在我的类定义中使用iadd函数,因为我无法直接访问存储在父类中的数据,但我可以使用iadd对其进行操作。)

2 个答案:

答案 0 :(得分:3)

__iadd__正在返回A的新实例,而不是修改原始实例。试试看:

a1.addA(a2)
print a1.n
print a1.__iadd__(a2).n

使用此A的定义来获取您所追求的行为:

class A(object):
    def __init__(self, n):
        self.n = n
    def __iadd__(self, other):
        self.n += other.n
        return self
    def addA(self, other):
        self+=other

答案 1 :(得分:3)

The docs

  

这些方法应该尝试就地进行操作(修改   自我)并返回结果(可能是,但不一定是,   自)

In [1]: class A(object):
   ...:     def __init__(self, n):
   ...:         self.n = n
   ...:     def __iadd__(self, other):
   ...:         self.n = self.n + other.n
   ...:         return self
   ...:     def addA(self, other):
   ...:         self += other
   ...:         

In [2]: a1 = A(9)

In [3]: a2 = A(8)

In [4]: a1.addA(a2)

In [5]: a1.n
Out[5]: 17