潇湘慕风 发表于 2022-4-20 00:09:15

一个简单的逻辑求指导

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__呢

suchocolate 发表于 2022-4-20 08:41:25

radd的前提是什么,tell me。

isdkz 发表于 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__ 方法就会被调用

潇湘慕风 发表于 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的实例对象相加么

isdkz 发表于 2022-4-20 09:58:40

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

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

如果不是就执行对方的 __radd__ 方法

潇湘慕风 发表于 2022-4-20 10:29:49

suchocolate 发表于 2022-4-20 08:41
radd的前提是什么,tell me。

我的理解是radd的前提是左边对象没有add方法
页: [1]
查看完整版本: 一个简单的逻辑求指导