pysunred 发表于 2023-1-28 18:07:19

魔法方法运算问题!!

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?
没有看明白,请高手指点,感谢!!!!!

isdkz 发表于 2023-1-28 18:13:43

5 - 6 就是 -1 呀,重写了 __add__方法使他返回 __sub__ 的结果

所以这里 5 + 6 得到的是 5 - 6

元豪 发表于 2023-1-28 18:41:38

2楼正解~

chinajz 发表于 2023-1-28 20:38:49

这题目容易引起误解, 属魔法范畴,最后变量计算结果时,加个 int或str等转换,就没有魔法了

chinajz 发表于 2023-1-28 21:42:58

c = a +b#结果为1

Mta123456 发表于 2023-1-29 08:50:43

__add__定义的是加法的行为,但在__add__里面返回的是__sub__,定义减法的行为

pysunred 发表于 2023-1-29 09:16:52

本帖最后由 pysunred 于 2023-1-29 09:19 编辑

感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:
两个变量引用了同一个类,为什么出来的结果不一样?
如果这个类是减法行为,
5引用了这个类,就应该是-5
6引用了这个类,就应该是-6
两个相加,就是-11
如果这个类是加法行为
5引用了这个类,就应该是5
6引用了这个类,就应该是6
两个相加,就是11才对吧。

鱼cpython学习者 发表于 2023-1-29 09:31:20

pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:


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

class New_int(int):
    def __add__(self, other):
      return int.__sub__(self, other) # 这里是在进行减法,即a + b实际上返回的是a - b的结果
    def __sub__(self, other):
      return int.__add__(self, other) # 这里是在进行加法,即a - b实际上返回的是a + b的结果
如你所见,c = b + a实际上就是c = 5 - 6,所以是-1

鱼cpython学习者 发表于 2023-1-29 09:32:45

pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:


你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)?

z5560636 发表于 2023-1-29 09:56:37

第一眼看上去,觉得这个问题深奥,可以学习一点东西,
然后复制了代码去调试,原来是我自己看错了,
我看成了
retun self.__sub__(self,other) # 这样会产生递归调用。

return int.__sub__(self,other) # 只是调用了int类型的减法

isdkz 发表于 2023-1-29 14:25:14

pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:


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

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

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

pysunred 发表于 2023-1-29 14:57:32

鱼cpython学习者 发表于 2023-1-29 09:32
你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)?

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

页: [1]
查看完整版本: 魔法方法运算问题!!