鱼C论坛

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

[已解决]魔法方法运算问题!!

[复制链接]
发表于 2023-1-28 18:07:19 | 显示全部楼层 |阅读模式

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

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

x
class New_int(int):
    def __add__(self, other):
        return int.__sub__(self, other)
    def __sub__(self, other):
        return int.__add__(self, other)

a = New_int(6)
b = New_int(5)
c = b + a
print(c)     # -1

使用同一个类,a的值是6,b的值是5,为什么相加的结果是-1?
没有看明白,请高手指点,感谢!!!!!
最佳答案
2023-1-29 09:31:20
pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:

我没看懂你说的类是加法行为和类是减法行为
你要知道,这种二元操作符调用的魔法方法一般都是左边对象的魔法方法
魔法方法定义的是对对象实行某个操作时会调用的方法
而如你代码:

  1. class New_int(int):
  2.     def __add__(self, other):
  3.         return int.__sub__(self, other) # 这里是在进行减法,即a + b实际上返回的是a - b的结果
  4.     def __sub__(self, other):
  5.         return int.__add__(self, other) # 这里是在进行加法,即a - b实际上返回的是a + b的结果
复制代码

如你所见,c = b + a实际上就是c = 5 - 6,所以是-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-28 18:13:43 | 显示全部楼层
5 - 6 就是 -1 呀,重写了 __add__  方法使他返回 __sub__ 的结果

所以这里 5 + 6 得到的是 5 - 6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-28 18:41:38 | 显示全部楼层
2楼正解~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-28 20:38:49 | 显示全部楼层
这题目容易引起误解, 属魔法范畴,最后变量计算结果时,加个 int或str等转换,就没有魔法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-28 21:42:58 | 显示全部楼层
c = a +b#结果为1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 08:50:43 | 显示全部楼层
__add__定义的是加法的行为,但在__add__里面返回的是__sub__,定义减法的行为
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 09:16:52 | 显示全部楼层
本帖最后由 pysunred 于 2023-1-29 09:19 编辑

感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:
两个变量引用了同一个类,为什么出来的结果不一样?
如果这个类是减法行为,
5引用了这个类,就应该是-5
6引用了这个类,就应该是-6
两个相加,就是-11
如果这个类是加法行为
5引用了这个类,就应该是5
6引用了这个类,就应该是6
两个相加,就是11才对吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 09:31:20 | 显示全部楼层    本楼为最佳答案   
pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:

我没看懂你说的类是加法行为和类是减法行为
你要知道,这种二元操作符调用的魔法方法一般都是左边对象的魔法方法
魔法方法定义的是对对象实行某个操作时会调用的方法
而如你代码:

  1. class New_int(int):
  2.     def __add__(self, other):
  3.         return int.__sub__(self, other) # 这里是在进行减法,即a + b实际上返回的是a - b的结果
  4.     def __sub__(self, other):
  5.         return int.__add__(self, other) # 这里是在进行加法,即a - b实际上返回的是a + b的结果
复制代码

如你所见,c = b + a实际上就是c = 5 - 6,所以是-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 09:32:45 | 显示全部楼层
pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:

你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 09:56:37 | 显示全部楼层
第一眼看上去,觉得这个问题深奥,可以学习一点东西,
然后复制了代码去调试,原来是我自己看错了,
我看成了
  1. retun self.__sub__(self,other) # 这样会产生递归调用。

  2. return int.__sub__(self,other) # 只是调用了int类型的减法
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-29 14:25:14 | 显示全部楼层
pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:

这样就可以达到你说的那种效果了:

  1. class New_int(int):
  2.     def __sub__(self, other):
  3.         return int.__add__(-self, -other)

  4. a = New_int(6)
  5. b = New_int(5)
  6. c = b + a
  7. print(c)       # 11
  8. c = b - a
  9. print(c)       # -11
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 14:57:32 | 显示全部楼层
鱼cpython学习者 发表于 2023-1-29 09:32
你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)?

是的,我就这样理解的,后来找了下资料,确实如你所说的,其实就是左边对象的魔法方法。
a+b,其实,a是默认的方法不会变的,b才会使用这个方法变成负的了。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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