魔法方法运算问题!!
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?
没有看明白,请高手指点,感谢!!!!! 5 - 6 就是 -1 呀,重写了 __add__方法使他返回 __sub__ 的结果
所以这里 5 + 6 得到的是 5 - 6 2楼正解~ 这题目容易引起误解, 属魔法范畴,最后变量计算结果时,加个 int或str等转换,就没有魔法了 c = a +b#结果为1 __add__定义的是加法的行为,但在__add__里面返回的是__sub__,定义减法的行为 本帖最后由 pysunred 于 2023-1-29 09:19 编辑
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:
两个变量引用了同一个类,为什么出来的结果不一样?
如果这个类是减法行为,
5引用了这个类,就应该是-5
6引用了这个类,就应该是-6
两个相加,就是-11
如果这个类是加法行为
5引用了这个类,就应该是5
6引用了这个类,就应该是6
两个相加,就是11才对吧。 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 pysunred 发表于 2023-1-29 09:16
感谢友友的热心回答
我能理解改写了加法行为
在我的理解是:
你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)? 第一眼看上去,觉得这个问题深奥,可以学习一点东西,
然后复制了代码去调试,原来是我自己看错了,
我看成了
retun self.__sub__(self,other) # 这样会产生递归调用。
return int.__sub__(self,other) # 只是调用了int类型的减法 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 鱼cpython学习者 发表于 2023-1-29 09:32
你是不是将魔法方法理解成了改变符号?a + b变成了(-a) + (-b)?
是的,我就这样理解的,后来找了下资料,确实如你所说的,其实就是左边对象的魔法方法。
a+b,其实,a是默认的方法不会变的,b才会使用这个方法变成负的了。
页:
[1]