是肥宅SRP啊 发表于 2022-12-3 17:30:09

python基本问题救助

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

>>> a = Nint(5)
>>> b = Nint(3)
>>> a + b
8
>>> 1 + b
__radd__ 被调用了!
4

我想问一下这里在执行1 + b 的时候,逻辑是不是因为1这个整数里面的方法只有__add__,同时又因为b在这里是个对象,所以返回的是notimplemented,接着就执行了b对象里的__radd__方法?还有就是他这个最后return int.__add__(self,other)是什么意思呀,这里的self此时不是b嘛?,那b 作为对象为啥int类里的__add__方法对他有用了,并且返回了4?

zhangjinxuan 发表于 2022-12-3 17:39:03

Nint继承了int,所以Nint也有__add__方法

zhangjinxuan 发表于 2022-12-3 17:42:38

但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

lxping 发表于 2022-12-3 20:19:48

你可以理解为整数1是没有__add__()魔法方法,所有就会去右边对象b中查找__radd__()魔法方法1.__add__(b)
SyntaxError: invalid decimal literal#语法错误
调用对象b的__radd__()魔法方法时返回int.__add__(self,other),就是int.__add__(b, 1)

是肥宅SRP啊 发表于 2022-12-4 15:03:30

lxping 发表于 2022-12-3 20:19
你可以理解为整数1是没有__add__()魔法方法,所有就会去右边对象b中查找__radd__()魔法方法
调用对象b的__ ...

为什么整数1没有__add__魔法方法呀?居然不是所有的整数类都有么,我一直以为整数类都有的{:5_99:}

是肥宅SRP啊 发表于 2022-12-4 15:07:58

zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

欸?一定要有__init__方法嘛?(我是真的笨),不过这个代码确实是能执行的

是肥宅SRP啊 发表于 2022-12-4 15:10:05

zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

欸?一定要有__init__方法嘛?(我是真的笨),不过这个代码确实是能执行的

zhangjinxuan 发表于 2022-12-4 15:13:23

是肥宅SRP啊 发表于 2022-12-4 15:07
欸?一定要有__init__方法嘛?(我是真的笨),不过这个代码确实是能执行的

我也忘了{:10_266:}

My_A 发表于 2022-12-4 15:18:21

zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

继承int的__init__了呗{:5_91:}

lxping 发表于 2022-12-4 15:50:58

是肥宅SRP啊 发表于 2022-12-4 15:03
为什么整数1没有__add__魔法方法呀?居然不是所有的整数类都有么,我一直以为整数类都有的

说实话这一点我也没有理解清楚,如果你将1赋值给a,a是可以调用__add__()魔法方法的
type(1)
<class 'int'>
a = 1
type(a)
<class 'int'>
a.__add__(2)
3

zhangjinxuan 发表于 2022-12-4 16:21:48

My_A 发表于 2022-12-4 15:18
继承int的__init__了呗

嗯,有道理哦{:10_256:}

是肥宅SRP啊 发表于 2022-12-4 16:56:13

lxping 发表于 2022-12-4 15:50
说实话这一点我也没有理解清楚,如果你将1赋值给a,a是可以调用__add__()魔法方法的

会不会这里其实1也是有__add__函数的,只是他这里是调用了__add__方法后return NotImplemented,然后才去找的b里的__radd__方法,不过为啥这里会return NotImplemented我又不太明白,是因为不能整数加对象么?,可是按照你说的把1赋值给a后在用__add__方法又可以(这里的b还是最开始的那个b=Nint(3),我懵了
>>> a=1
>>> a.__add__(b)
4

lxping 发表于 2022-12-4 17:20:31

本帖最后由 lxping 于 2022-12-4 17:22 编辑

是肥宅SRP啊 发表于 2022-12-4 16:56
会不会这里其实1也是有__add__函数的,只是他这里是调用了__add__方法后return NotImplemented,然后才去 ...

1.__add__(b),这个是语法错误,python认为1.xxx表示一个浮点数,所以后面写的__add__不符合浮点数的格式要求
但是(1)是可以的(1).__add__(b)
4
(1) + b
__radd__ 被调用了!
4

是肥宅SRP啊 发表于 2022-12-5 14:40:55

lxping 发表于 2022-12-4 17:20
1.__add__(b),这个是语法错误,python认为1.xxx表示一个浮点数,所以后面写的__add__不符合浮点数的格 ...

哇,这样啊!

猪猪以都都 发表于 2022-12-6 00:11:17

是肥宅SRP啊 发表于 2022-12-5 14:40
哇,这样啊!

唉,晚了一步
页: [1]
查看完整版本: python基本问题救助