鱼C论坛

 找回密码
 立即注册
查看: 2931|回复: 5

[已解决]一个简单的逻辑求指导

[复制链接]
发表于 2022-4-20 00:09:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Nint(int):
        def __radd__(self, other):
                print("__radd__ 被调用了!")
                return int.__add__(self, other)

a = Nint(5)
b = Nint(3)

print(a + b)


c = int(1)

print(c + b)

执行结果:
8
__radd__ 被调用了!
4

按照我的理解,执行print(c+b)的时候,由于c是从int类型的实例,应该直接调用int类型的__add__(self,other)方法,为什么这里还会执行__radd__呢
最佳答案
2022-4-20 08:55:34
本帖最后由 isdkz 于 2022-4-20 08:58 编辑

>>> b = Nint(3)
>>> b.__radd__
<bound method Nint.__radd__ of 3>


你可以看到 Nint 的 __radd__ 方法是 Nint.__radd__,

左操作数如果没有实现 Nint.__add__ 的话,Nint.__radd__ 就会被调用,

你再看一下 int 的 __add__:
>>> c = int(1)
>>> c.__add__
<method-wrapper '__add__' of int object at 0x72E79CE0>
>>>


int 的 add 方法是 method-wrapper '__add__' of int object ,并不是 Nint.__add__,

所以 Nint 的 __radd__ 方法就会被调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-20 08:41:25 | 显示全部楼层
radd的前提是什么,tell me。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-20 08:55:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-4-20 08:58 编辑

>>> b = Nint(3)
>>> b.__radd__
<bound method Nint.__radd__ of 3>


你可以看到 Nint 的 __radd__ 方法是 Nint.__radd__,

左操作数如果没有实现 Nint.__add__ 的话,Nint.__radd__ 就会被调用,

你再看一下 int 的 __add__:
>>> c = int(1)
>>> c.__add__
<method-wrapper '__add__' of int object at 0x72E79CE0>
>>>


int 的 add 方法是 method-wrapper '__add__' of int object ,并不是 Nint.__add__,

所以 Nint 的 __radd__ 方法就会被调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-4-20 09:45:44 | 显示全部楼层
isdkz 发表于 2022-4-20 08:55
你可以看到 Nint 的 __radd__ 方法是 Nint.__radd__,

左操作数如果没有实现 Nint.__add__ 的话,Ni ...

大佬,你说的我能看懂,但是我还是不太明白这个顺序,如果int有add方法,那我int型的实例c在左边,为什么不首先用int 的add方法。是因为c的add方法,不能用来和Nint的实例对象相加么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-20 09:58:40 | 显示全部楼层
潇湘慕风 发表于 2022-4-20 09:45
大佬,你说的我能看懂,但是我还是不太明白这个顺序,如果int有add方法,那我int型的实例c在左边,为什么 ...

这可能是在内部实现机制里面在 __add__ 方法里会先判断对方的 __radd__ 方法是不是自己所属类的,

如果不是就执行对方的 __radd__ 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-20 10:29:49 | 显示全部楼层
suchocolate 发表于 2022-4-20 08:41
radd的前提是什么,tell me。

我的理解是radd的前提是左边对象没有add方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 17:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表