lingedu 发表于 2020-7-6 19:02:32

python魔法方法求解?

class Nint(int):
        def __radd__(self,other):
                return int.__sub__(self,other)


a = Nint(5)
1+a为啥会调用反运算啊,1的int类里不是有add的方法吗?为啥会调用反运算啊?

Twilight6 发表于 2020-7-6 19:15:59


反运算符:仅当左操作数不支持相应的操作且操作数类型不同时才调用这些函数。

因为 int 不支持和一个实例对象进行相加,int 只支持整型相加,所以调用的是Nint的反运算符方法:

>>> print(type(a))
<class '__main__.Nint'>


lingedu 发表于 2020-7-6 19:32:05

Twilight6 发表于 2020-7-6 19:15
反运算符:仅当左操作数不支持相应的操作且操作数类型不同时才调用这些函数。

因为 int 不支持和一个 ...

大佬,我不太明白。那1+a反运算那也是调用int的sub方法啊,那减法也不支持对象减去整形啊

qiuyouzhi 发表于 2020-7-6 19:41:51

lingedu 发表于 2020-7-6 19:32
大佬,我不太明白。那1+a反运算那也是调用int的sub方法啊,那减法也不支持对象减去整形啊

>>> class A(int):
        def __radd__(self, other):
                print(self, other)
                return int.__sub__(self, other)

       
>>> a = A(5)
>>> a
5
>>> type(a)
<class '__main__.A'>
>>> 1 + a
5 1
4

Twilight6 发表于 2020-7-6 19:42:36

lingedu 发表于 2020-7-6 19:32
大佬,我不太明白。那1+a反运算那也是调用int的sub方法啊,那减法也不支持对象减去整形啊




但是你 传入实例对象的 参数就是 int 类型的值,然后再 __add__里面调用时候就是两个 int 类型的值相互运算了



永恒的蓝色梦想 发表于 2020-7-6 20:33:26

本帖最后由 永恒的蓝色梦想 于 2020-7-6 20:45 编辑

lingedu 发表于 2020-7-6 19:32
大佬,我不太明白。那1+a反运算那也是调用int的sub方法啊,那减法也不支持对象减去整形啊

1+a反运算那也是调用int的sub方法啊可是 a+1!=1-a 啊?

Twilight6 发表于 2020-7-6 20:44:04

永恒的蓝色梦想 发表于 2020-7-6 20:33
小学没学好?a+1=1-a?



{:10_297:}你忘记你 6 月 25 号发的记录了嘛,我要监督你哈哈
页: [1]
查看完整版本: python魔法方法求解?