我声明了一个值为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__
方法时抛出此异常?
答案 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}}行为。