一个简单的逻辑求指导
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__呢 radd的前提是什么,tell me。 本帖最后由 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__ 方法就会被调用
isdkz 发表于 2022-4-20 08:55
你可以看到 Nint 的 __radd__ 方法是 Nint.__radd__,
左操作数如果没有实现 Nint.__add__ 的话,Ni ...
大佬,你说的我能看懂,但是我还是不太明白这个顺序,如果int有add方法,那我int型的实例c在左边,为什么不首先用int 的add方法。是因为c的add方法,不能用来和Nint的实例对象相加么 潇湘慕风 发表于 2022-4-20 09:45
大佬,你说的我能看懂,但是我还是不太明白这个顺序,如果int有add方法,那我int型的实例c在左边,为什么 ...
这可能是在内部实现机制里面在 __add__ 方法里会先判断对方的 __radd__ 方法是不是自己所属类的,
如果不是就执行对方的 __radd__ 方法
suchocolate 发表于 2022-4-20 08:41
radd的前提是什么,tell me。
我的理解是radd的前提是左边对象没有add方法
页:
[1]