鱼C论坛

 找回密码
 立即注册
查看: 1781|回复: 11

[已解决]魔法方法的 __add__(self, other) 实现过程求助!

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

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

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

x
无标题.png

最佳答案
2020-3-25 17:23:06
你的理解是对的。
int.__sub__(self,other)就是调用int的__sub__函数。

a和b是New_int类的对象,在该类中对运算符+和-进行了重载,
执行a+b 时,就会调用该类中重载的__add__函数,
__add__函数中调用了int类的int.__sub__函数,并将其返回值作为此函数的返回值
相当于以下写法
        def __add__(self,other):
                c=int.__sub__(self,other)
                return c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-25 17:15:27 | 显示全部楼层
a+b要怎样理解是什么意思?
a+b就是a.__add__(b)啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 17:23:06 | 显示全部楼层    本楼为最佳答案   
你的理解是对的。
int.__sub__(self,other)就是调用int的__sub__函数。

a和b是New_int类的对象,在该类中对运算符+和-进行了重载,
执行a+b 时,就会调用该类中重载的__add__函数,
__add__函数中调用了int类的int.__sub__函数,并将其返回值作为此函数的返回值
相当于以下写法
        def __add__(self,other):
                c=int.__sub__(self,other)
                return c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 17:23:16 | 显示全部楼层
int.__sub__() 就是调用 int 类的减法操作,第一个参数是被减数,第二个参数是减数

在这里 self 是被减数,other 是减数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 17:24:38 | 显示全部楼层
a+b先尝试调用a的add方法,a传入self,b传入other,返回的是父类int的sub方法,于是返回int__sub__(a,b),就是a-b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 17:30:50 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-25 17:15
a+b要怎样理解是什么意思?
a+b就是a.__add__(b)啊

a+b 不是会调用到 def __add__(self, other) 这个函数吗。但是返回值设置的是int.__sub__(self, other) , 结果就变成了a-b,但是这个过程该怎么解释呢,就像数学题,知道答案,但是过程不知道怎么算的,我就是想知道这个过程该是怎么做到的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 17:48:20 | 显示全部楼层
class Myint:

    def __init__(self, number):
        self.number = number

    def __add__(self, other):
        return self.number + other.number


a = Myint(5)
b = Myint(6)
print(a+b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-25 17:50:14 | 显示全部楼层
sunrise085 发表于 2020-3-25 17:23
你的理解是对的。
int.__sub__(self,other)就是调用int的__sub__函数。

谢谢你的回答很专业,不过有一点可能我是刚学习Python所有有很多还是不懂得,一开始我看不懂int类的__sub__函数代表的是什么意思,刚刚看了int类的__sub__(self, other)方法,他的返回值是self-other,看了这个突然觉就醒悟过来了!感谢指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 17:53:28 | 显示全部楼层
zltzlt 发表于 2020-3-25 17:23
int.__sub__() 就是调用 int 类的减法操作,第一个参数是被减数,第二个参数是减数

在这里 self 是被减 ...

感谢指导,现在理解了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 17:54:09 | 显示全部楼层
flamezyy 发表于 2020-3-25 17:24
a+b先尝试调用a的add方法,a传入self,b传入other,返回的是父类int的sub方法,于是返回int__sub__(a,b),就 ...

感谢指导,现在理解了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 17:58:12 | 显示全部楼层
lzone 发表于 2020-3-25 17:30
a+b 不是会调用到 def __add__(self, other) 这个函数吗。但是返回值设置的是int.__sub__(self, other) , ...

你现在重写的是不可变int这个类的方法。

通过自定义的方法把加定义为减、减定义为加。

a实例后传入的就是3的值,也就是a就是类定义中的self自己,b就是other了。

同理,b实例后,5就是你传入的self实例值,other就是a了。

求a+b。就相当于a实例3后减了other的b的实例5,结果为-2.

如果求得是b+a的话,b就是self,a就是other,结果就反过来为2了。




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

使用道具 举报

 楼主| 发表于 2020-3-25 18:10:24 | 显示全部楼层
heidern0612 发表于 2020-3-25 17:58
你现在重写的是不可变int这个类的方法。

通过自定义的方法把加定义为减、减定义为加。

看懂了,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 10:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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