两个对象相加后的结果是什么
问题一:是不是只有同类产生的对象才可以相加?我个人觉得这句话不太对:class New_int(int):
def __add__(self, other):#自定义的加法
return int.__sub__(self, other)
def __sub__(self, other):#自定义的减法
return int.__add__(self, other)#调用int对象的加法
class New_int1(int):
def __add__(self, other):#自定义的加法
return int.__add__(self, other)
def __sub__(self, other):#自定义的减法
return int.__sub__(self, other)#调用int对象的加法
>>>a=New_int(2),b=New_int1(3) 然后计算a+b的结果是会按照a的魔法方法add去加的,那么问题来了,我如果计算a+b+b那么结果是会调用谁的魔法方法add来加?
2)上一个问题就引出了我的第二个问题。两个对象相加后的结果是什么?是一个什么类的是由谁决定的?{:5_92:} 1. 不是,不管 other 是不是同类都将传递给 __add__
2. 假设 a + b,先调用 a.__add__(b),如果 a 没有 __add__ 方法或者在调用 a 的 __add__ 方法时出错了就会调用 b.__radd__(a) 。
特别地,如果 type(b) 是 type(a) 的子类,则优先调用 b.__radd__(a)。例子:
>>> class A:
def __add__(self, other):
print('A 的 __add__ 方法被调用了')
>>> class B(A):
def __radd__(self, other):
print('B 的 __radd__ 方法被调用了')
>>> a = A()
>>> b = B()
>>> a + b
B 的 __radd__ 方法被调用了 之所以能相加是因为两个类都继承了int。
所以是可以直接相加的。即使你没有重载__add__,也是可以相加的。
a+b调用的是a的魔法方法,python是从左至右的。
这两个相加后是int类,因为你的魔法方法返回值是int.__add__()
当只有两是相加的时候,调用的是第一个数的魔法方法,多个数连加的时候,调用的就是int.__add__()了,不再是新写的类的魔法方法 这个运算符号重写的方法调用哪个对象看得是符号前面的对象是谁,所以第一步a + b调用了a所属的类的魔法方法,因为加完之后结果是一个整型不属于所定制的两个类,此时就调用原有的加法法则了。
由此推出a + b + b结果是2,思路如上。 Hoiste 发表于 2020-4-27 17:24
这个运算符号重写的方法调用哪个对象看得是符号前面的对象是谁,所以第一步a + b调用了a所属的类的魔法方法 ...
那是不是说其实对象的操作是不会限制两个对象的类的,输出的类是由什么决定的呢?具体数据的结果自己嘛?
页:
[1]