2013-07-08 5 views
2

Я пытаюсь понять, почему я не могу использовать iadd (+ =) внутри класса на самообъекте.Невозможно использовать iadd в классе python

Например, если я определить класс с iadd и функции, которая использует iadd (Адда):

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) 

Если я использую функцию Адда, a1, кажется, не будут затронуты:

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

Однако, если я использую iadd нормально, это работает нормально:

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

может кто-нибудь сказать мне, как я могу использовать iadd с в определении класса.

(Надеюсь, это не имеет значения, но я спрашиваю об этом, поскольку я пытаюсь создать оболочку для объекта maya.OpenMaya.MMatrix. Я хотел бы добавить функцию для применения произвольного преобразования. использовать функцию iadd внутри определения моего класса, поскольку у меня нет прямого доступа к данным, хранящимся в родительском классе, но я могу манипулировать им с помощью iadd.)

ответ

3

__iadd__ возвращает новый экземпляр A и не изменяет исходный экземпляр. Постарайтесь, чтобы это увидеть:

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

Используйте это определение, чтобы получить информацию о поведении вы после:

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 
3

The docs:

Эти методы должны попытаться сделать операцию In- место (изменение self) и вернуть результат (который может быть, но не обязательно, self)

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 
Смежные вопросы