首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:“int”对象没有属性“__iadd__”

python:“int”对象没有属性“__iadd__”
EN

Stack Overflow用户
提问于 2017-05-29 15:36:19
回答 2查看 491关注 0票数 0

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

代码语言:javascript
复制
>>> x = 0

当我运行这行代码时:

代码语言:javascript
复制
>>> x += 3
>>> x
3

万事如意。但当我运行这行代码时:

代码语言:javascript
复制
>>> x.__iadd__(3)

Python会引发一个异常:

代码语言:javascript
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'

为什么在operator模块的official python documentation中,+=操作符调用__iadd__方法时,python会抛出这个异常?

EN

回答 2

Stack Overflow用户

发布于 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

票数 6
EN

Stack Overflow用户

发布于 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行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44236968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档