我声明了一个值为0的整数变量x。
>>> 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__'为什么在operator模块的official python documentation中,+=操作符调用__iadd__方法时,python会抛出这个异常?
发布于 2017-05-29 15:40:38
在
operator模块的官方python文档中说+=操作符调用__iadd__方法?
不,它说a += b等同于a = operator.iadd(a, b),而不是a.__iadd__(b)。
operator.iadd(a, b)不等同于a.__iadd__(b)。如果__iadd__不存在,则operator.iadd回退到__add__和__radd__,或者返回NotImplemented。
发布于 2017-05-29 15:42:06
它并没有这么说;您在文档中链接到的是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,但不一定是self)。如果未定义特定方法,则增加的赋值将恢复为正常方法。 ...
因此,对象可以定义__iadd__来覆盖+=操作的行为,但是如果没有定义这样的方法,它将恢复到默认的a = a + b行为。
https://stackoverflow.com/questions/44236968
复制相似问题