鱼C论坛

 找回密码
 立即注册
查看: 3504|回复: 16

[已解决]python基本问题救助

[复制链接]
发表于 2022-12-3 17:30:09 | 显示全部楼层 |阅读模式

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

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

x
>>> 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?
最佳答案
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-3 17:39:03 | 显示全部楼层

回帖奖励 +10 鱼币

Nint继承了int,所以Nint也有__add__方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-3 17:42:38 | 显示全部楼层
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么整数1没有__add__魔法方法呀?居然不是所有的整数类都有么,我一直以为整数类都有的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-4 15:07:58 | 显示全部楼层
zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

欸?一定要有__init__方法嘛?(我是真的笨),不过这个代码确实是能执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-4 15:10:05 | 显示全部楼层
zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

欸?一定要有__init__方法嘛?(我是真的笨),不过这个代码确实是能执行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我也忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-4 15:18:21 | 显示全部楼层
zhangjinxuan 发表于 2022-12-3 17:42
但是你这Nint好像也没有__init__方法,你的代码怎么执行的?

继承int的__init__了呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-4 16:21:48 | 显示全部楼层
My_A 发表于 2022-12-4 15:18
继承int的__init__了呗

嗯,有道理哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哇,这样啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-6 00:11:17 | 显示全部楼层

唉,晚了一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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