鱼C论坛

 找回密码
 立即注册
查看: 980|回复: 12

python魔方方法反运算

[复制链接]
发表于 2020-5-23 18:36:24 | 显示全部楼层 |阅读模式

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

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

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

a=New_int(1)
b=New_int(2)
print(a+b)

疑问:小甲鱼说a对象默认有__add__()方法,所以b的__radd__()没有执行,但是在New_int中没有定义__add__()方法啊,怎么会有这个__add__方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-23 18:39:12 | 显示全部楼层
New_int 继承了 int 的 __add__() 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 18:39:43 | 显示全部楼层
New_int继承了int的方法,自然也就有__add__()了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 18:46:19 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-23 18:39
New_int 继承了 int 的 __add__() 方法

是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 18:47:16 | 显示全部楼层
KevinHu 发表于 2020-5-23 18:39
New_int继承了int的方法,自然也就有__add__()了

是继承了int对象的__add__()方法吗?没有重写就默认调用int对象的__add__()方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 18:50:35 | 显示全部楼层
daisanosng 发表于 2020-5-23 18:46
是继承了object对象的__add__()方法吗?没有重写就默认调用object对象的__add__()方法?

我说了是 int,看不见?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-23 18:57:33 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-5-23 18:50
我说了是 int,看不见?

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

a=New_int(1)
print(dir(a))
b=int(2)
print(dir(b))
print(b+a)

运行结果:
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dict__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
1

疑问:通过dir()函数查找,b对象有__add__()方法,为什么不调用b对象的__add__()方法,而调用a对象的
__radd__()方法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 19:10:12 | 显示全部楼层
daisanosng 发表于 2020-5-23 18:57
class New_int(int):
    def __radd__(self,other):
        return  int.__sub__(other,self)

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

使用道具 举报

 楼主| 发表于 2020-5-23 19:42:46 | 显示全部楼层

有什么,你直说,我看书的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 23:14:29 | 显示全部楼层
class 类名(继承的类的名字):
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 08:32:45 From FishC Mobile | 显示全部楼层
daisanosng 发表于 2020-5-23 18:57
class New_int(int):
    def __radd__(self,other):
        return  int.__sub__(other,self)

你把左操作数和右操作数的概念混淆了
在执行 a + b 的时候,因为 a 默认有 __add__() 方法,所以 b 的 __radd__() 没有执行
只有 b 作为 右操作数且左操作数没有 __add__() 方法的时候才会执行 __radd__()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 13:15:23 | 显示全部楼层
_2_ 发表于 2020-5-24 08:32
你把左操作数和右操作数的概念混淆了
在执行 a + b 的时候,因为 a 默认有 __add__() 方法,所以 b 的 _ ...

你仔细看下,print(b+a),b是左操作数且通过dir(b)查看有__add__()方法,但还是调用了右操作数的__radd__()方法,我举的例子和小甲鱼的不同,b是int()函数生成的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-28 10:25:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 01:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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