栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

a + b和a .__ add __(b)之间的区别

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

a + b和a .__ add __(b)之间的区别

a+b
等价于
import operator;operator.add(a,b)
。首先调用
a.__add__(b)
,然后根据需要调用
b.__radd__(a)
。但是
ifsubclass(type(b),type(a))
,则先
b.__radd__(a)
被称为。

根据有关“特殊”方法的文档:

  • 关于
    __add__()

__add__()
被调用以实现二进制算术“ +”运算。例如,要评估表达式x +
y,其中x是具有
__add__()
方法的类的实例
x.__add__(y)

如果这些方法之一不支持使用提供的参数进行的操作,则应返回 NotImplemented

  • 关于
    __radd__()

仅当左操作数不支持相应的操作并且操作数是不同类型时,才调用这些函数。例如,如果返回NotImplemented

__radd__()
y.__radd__(x)
则调用求值x + y的表达式,其中y是具有方法的类的实例
x.__add__(y)

如果右操作数的类型是左操作数类型的子类,并且该子类为操作提供了反映的方法,则将在左操作数的非反射方法之前调用此方法。此行为允许子类覆盖其祖先的操作。

根据行为举例说明:

情况1:

>>> print 1+c('C.__radd__', <__main__.C instance at 0x7ff5631397a0>, 1)reversed result

radd
仅当左操作数不支持相应的操作并且操作数是不同类型时,才调用这些函数。在这种情况下,
1
不支持类的添加,因此,它会退回到类的
__radd__()
功能
C
。如果
__radd__
没有在
C()
课堂上实施,它将退回到
__add__()

情况2:

>>> 1 .__add__(c)NotImplemented>>> c .__add__(1)('C.__add__', <__main__.C instance at 0x7ff563139830>, 1)'result'

1 .__add__(c)
给出
NotImplemented
1
是的
int
类型和
add
int
类不支持
add
使用C类对象。但是
c.__add(1)
运行是因为
C()
类支持。

情况3:

>>> int.__add__(1, c)NotImplemented>>> C.__add__(c, 1)('C.__add__', <__main__.C instance at 0x7ff5610add40>, 1)'result'

类似于

case 2
。但是在这里,调用是通过带有第一个参数的类作为该类的对象进行的。行为将是相同的。

情况4:

>>> int.__add__(c, 1)Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: descriptor '__add__' requires a 'int' object but received a 'instance'>>> C.__add__(1, c)Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: unbound method __add__() must be called with C instance as first argument (got int instance instead)

反之亦然

case 3
。从堆栈跟踪中可以清楚地看出,
__add__
将调用类的对象作为第一个参数,否则将导致异常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623486.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号