python:'int'对象没有属性'__iadd__'

时间:2017-05-29 07:36:19

标签: python

我声明了一个值为x的整数变量0

>>> x = 0

当我运行这一行时:

>>> x += 3
>>> x
3

一切顺利。但是,当我运行这一行时:

>>> x.__iadd__(3)

Python引发了一个异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'

为什么python会在official python documentation operator模块中+=运算符调用__iadd__方法时抛出此异常?

2 个答案:

答案 0 :(得分:6)

  

operator模块的官方python文档中说+=运算符调用__iadd__方法?

不,它说a += b相当于a = operator.iadd(a, b),而不是a.__iadd__(b)

operator.iadd(a, b)不等同于a.__iadd__(b)。如果operator.iadd不存在,则__add__会回退到__radd____iadd__,或者会返回NotImplemented

答案 1 :(得分:3)

它没有说;您在文档中链接的内容是operator模块:

  

operator.iadd(a, b)
  operator.__iadd__(a, b)

     

a = iadd(a, b)相当于a += b

operator模块包含运算符和类似事物的等价函数,它没有定义标准的Python运算符。它没有说明x.__iadd__

相关文档更像this

  

object.__iadd__(self, other)

     

调用这些方法来实现增强算术赋值(+=,...)。这些方法应该尝试就地执行操作(修改 self )并返回结果(可能是,但不一定是 self )。 如果未定义特定方法,则扩充分配将回退到常规方法。 ...

因此,对象可以定义__iadd__来覆盖+=操作的行为,但是如果没有定义这样的方法,它将回退到默认值{ {1}}行为。