我试图理解为什么我不能在自我对象的类中使用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对其进行操作。)
答案 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)
这些方法应该尝试就地进行操作(修改 自我)并返回结果(可能是,但不一定是, 自)
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