鱼C论坛

 找回密码
 立即注册
查看: 1059|回复: 4

[已解决]两个对象相加后的结果是什么

[复制链接]
发表于 2020-4-27 16:52:26 | 显示全部楼层 |阅读模式

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

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

x
问题一:是不是只有同类产生的对象才可以相加?我个人觉得这句话不太对:
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)上一个问题就引出了我的第二个问题。两个对象相加后的结果是什么?是一个什么类的是由谁决定的?
最佳答案
2020-4-27 17:05:07
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__ 方法被调用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-27 17:05:07 | 显示全部楼层    本楼为最佳答案   
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__ 方法被调用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 17:05:13 | 显示全部楼层
之所以能相加是因为两个类都继承了int。
所以是可以直接相加的。即使你没有重载__add__,也是可以相加的。
a+b调用的是a的魔法方法,python是从左至右的。

这两个相加后是int类,因为你的魔法方法返回值是int.__add__()
当只有两是相加的时候,调用的是第一个数的魔法方法,多个数连加的时候,调用的就是int.__add__()了,不再是新写的类的魔法方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-27 17:24:40 | 显示全部楼层
这个运算符号重写的方法调用哪个对象看得是符号前面的对象是谁,所以第一步a + b调用了a所属的类的魔法方法,因为加完之后结果是一个整型不属于所定制的两个类,此时就调用原有的加法法则了。
由此推出a + b + b结果是2,思路如上。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-27 17:29:54 | 显示全部楼层
Hoiste 发表于 2020-4-27 17:24
这个运算符号重写的方法调用哪个对象看得是符号前面的对象是谁,所以第一步a + b调用了a所属的类的魔法方法 ...

那是不是说其实对象的操作是不会限制两个对象的类的,输出的类是由什么决定的呢?具体数据的结果自己嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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