鱼C论坛

 找回密码
 立即注册
查看: 1117|回复: 5

[已解决]pytho 魔法方法求助

[复制链接]
发表于 2018-5-13 18:38:44 | 显示全部楼层 |阅读模式
3鱼币
  1. class Try_int(int):
  2.     def __add__(self, other):
  3.         return self + other
  4.     def __sub__(self, other):
  5.         return self - other
复制代码

执行这个 会进入无限递归,然后这样写:
  1. class Try_int(int):
  2.     def __add__(self, other):
  3.         return int(self) + int(other)
  4.     def __sub__(self, other):
  5.         return int(self) - int(other
复制代码

然后这样执行就正常了。//// 我想问  上面代码 抛出异常无限递归的原因 是在__add__()魔法方法时候,返回值中又调用了 ‘+‘ ,那下面代码中是加了 int()
但是 return int(self) + int(other)  这个返回值中还是有 ’+‘ 的?不是又调用了 __add__() 魔法方法么?
最佳答案
2018-5-13 18:38:45
本帖最后由 久疤K 于 2018-5-13 20:24 编辑

你的Try_int类实例,在相加时,会执行__add__方法,而你的__add__方法中,又执行了相加操作,于是又会调用__add__方法,于是无限递归。
而后者,在相加操作时,内部操作为:
  1. return int(self) + int(other)
复制代码
,它是先转化为int类型,而后相加,调用的是int类型的__add__方法,其内部实现我们无需去计较了,与本类无关。
同时,也要注意到,两个本类对象相加后,得到的数据是int类型的,不是本类对象咯。。
如果要想结果也是本类对象,可以写成
  1. return Try_int(int(self) + int(other))
复制代码
,有时候有可能会有这种需求。

最佳答案

查看完整内容

你的Try_int类实例,在相加时,会执行__add__方法,而你的__add__方法中,又执行了相加操作,于是又会调用__add__方法,于是无限递归。 而后者,在相加操作时,内部操作为:,它是先转化为int类型,而后相加,调用的是int类型的__add__方法,其内部实现我们无需去计较了,与本类无关。 同时,也要注意到,两个本类对象相加后,得到的数据是int类型的,不是本类对象咯。。 如果要想结果也是本类对象,可以写成,有时候有可能会有 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-13 18:38:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 久疤K 于 2018-5-13 20:24 编辑

你的Try_int类实例,在相加时,会执行__add__方法,而你的__add__方法中,又执行了相加操作,于是又会调用__add__方法,于是无限递归。
而后者,在相加操作时,内部操作为:
  1. return int(self) + int(other)
复制代码
,它是先转化为int类型,而后相加,调用的是int类型的__add__方法,其内部实现我们无需去计较了,与本类无关。
同时,也要注意到,两个本类对象相加后,得到的数据是int类型的,不是本类对象咯。。
如果要想结果也是本类对象,可以写成
  1. return Try_int(int(self) + int(other))
复制代码
,有时候有可能会有这种需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-13 19:13:00 From FishC Mobile | 显示全部楼层
调用的int类的加法,而不是你定义的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-13 20:29:50 | 显示全部楼层
BngThea 发表于 2018-5-13 19:13
调用的int类的加法,而不是你定义的

知道了 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-13 20:33:18 | 显示全部楼层
久疤K 发表于 2018-5-13 20:14
你的Try_int类实例,在相加时,会执行__add__方法,而你的__add__方法中,又执行了相加操作,于是又会调用_ ...

好的 谢谢 非常详细

return int(self) + int(other)  它是先转化为int类型,而后相加,调用的是int类型的__add__方法,
其内部实现我们无需计较,与本类无关。注意:两个本类对象相加后,得到的数据是int类型的,
不是本类对象喽。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-23 19:29:26 | 显示全部楼层
久疤K 发表于 2018-5-13 18:38
你的Try_int类实例,在相加时,会执行__add__方法,而你的__add__方法中,又执行了相加操作,于是又会调用_ ...

这个答案非常的详细,很棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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