鱼C论坛

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

[已解决]关于python42节课的方法产生的无限递归错误方法理解

[复制链接]
发表于 2017-7-23 17:50:17 | 显示全部楼层 |阅读模式

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

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

x
1
>>> class Try_int(int):
        def __add__(self, other):
                return self + other

        
>>> a = Try_int(3)
>>> b = Try_int(2)
>>> a + b
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    a + b
  File "<pyshell#30>", line 3, in __add__
    return self + other
  File "<pyshell#30>", line 3, in __add__
    return self + other
  File "<pyshell#30>", line 3, in __add__
    return self + other
  [Previous line repeated 327 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

2
>>> class Try_int(int):
        def __add__(self, other):
                return int(self) + int(other)              #还是没太理解,为啥转化整形之后就可以出结果,相加的不是方法吗

        
>>> a = Try_int(3)
>>> b = Try_int(2)
>>> a + b
5
最佳答案
2017-7-24 10:58:47
本帖最后由 ba21 于 2017-7-24 11:11 编辑

>>> class Try_int(int):
        def __add__(self, other):
                return self + other
这里你用Try__int重写了int的__add__方法;
>>> a = Try_int(3)
>>> b = Try_int(2)
>>> a + b
返回的是 self + other,然后 又是 a + b 就陷入了无限递归,意思就是这里只要给合理的退出这个递归的代码就不会了。

return int(self) + int(other) 为什么加了int就正常了?
加了int就是把这句 int(self) + int(other) 交给了int父类去处理了;
  return self + other 其实就好比 return Try_int(self) + Try_int(other) 自己又调用了自己,但是你又没有写退出这个递归的代码

注:加法不一定要用+ ;四则运算符的操作在编程里面有很多其它的方法可以实现。这段问题代码如果换做别的方法就不存在递归了

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-23 21:11:19 | 显示全部楼层
a + b调用的是魔法方法__add__,而它使用的又是self + other,又是加法,又调用魔法方法__add__,这就形成了无限递归。
而int(self) + int(other)则是两个整数的加法,不会调用Try_int的加法,就没问题了。
实际上只要破坏了它的递归就行,还可以采用其他方法。如:
  1. >>> class Try_int(int):
  2.         def __add__(self, other):
  3.                 return self -- other

  4.        
  5. >>> a = Try_int(3)
  6. >>> b = Try_int(2)
  7. >>> a + b
  8. 5
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-7-23 18:40:18 | 显示全部楼层
那也是数啊
你还创个淘专辑,,,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-23 19:01:01 | 显示全部楼层
你有啥不明白的,转换成  return int(self) + int(other) 后会调用int对象自己的相加方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-23 22:23:56 | 显示全部楼层
新手·ing 发表于 2017-7-23 18:40
那也是数啊
你还创个淘专辑,,,

谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-23 22:24:31 | 显示全部楼层
Krant5 发表于 2017-7-23 19:01
你有啥不明白的,转换成  return int(self) + int(other) 后会调用int对象自己的相加方法

明白了,谢谢,原来是直接用int的方法了,这个有点取巧的感觉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-23 22:27:48 | 显示全部楼层
本帖最后由 冬雪雪冬 于 2017-7-23 22:47 编辑
冬雪雪冬 发表于 2017-7-23 21:11
a + b调用的是魔法方法__add__,而它使用的又是self + other,又是加法,又调用魔法方法__add__,这就形成 ...

谢谢,明白为啥可以计算了,但是请原谅我没太理解--是什么符号呢, 查询了下Python符号,没有找到--。  self -- other ,  麻烦解释下,谢谢啦

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-23 22:48:02 | 显示全部楼层
游戏小虾米 发表于 2017-7-23 22:27
谢谢,明白为啥可以计算了,但是请原谅我没太理解--是什么符号呢, 查询了下Python符号,没有找到--。  s ...

这实际是两个操作符,第一个是双目的减号,第二个是单目的取反,即a+b相当于a减去负的b
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-23 22:54:16 | 显示全部楼层
冬雪雪冬 发表于 2017-7-23 22:48
这实际是两个操作符,第一个是双目的减号,第二个是单目的取反,即a+b相当于a减去负的b

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-24 10:58:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ba21 于 2017-7-24 11:11 编辑

>>> class Try_int(int):
        def __add__(self, other):
                return self + other
这里你用Try__int重写了int的__add__方法;
>>> a = Try_int(3)
>>> b = Try_int(2)
>>> a + b
返回的是 self + other,然后 又是 a + b 就陷入了无限递归,意思就是这里只要给合理的退出这个递归的代码就不会了。

return int(self) + int(other) 为什么加了int就正常了?
加了int就是把这句 int(self) + int(other) 交给了int父类去处理了;
  return self + other 其实就好比 return Try_int(self) + Try_int(other) 自己又调用了自己,但是你又没有写退出这个递归的代码

注:加法不一定要用+ ;四则运算符的操作在编程里面有很多其它的方法可以实现。这段问题代码如果换做别的方法就不存在递归了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-24 23:06:58 | 显示全部楼层
ba21 发表于 2017-7-24 10:58
>>> class Try_int(int):
        def __add__(self, other):
                return self + other

谢谢,明白一些了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-25 01:04:11 | 显示全部楼层
最佳给得给不
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-7 12:59:49 | 显示全部楼层
冬雪雪冬 发表于 2017-7-23 21:11
a + b调用的是魔法方法__add__,而它使用的又是self + other,又是加法,又调用魔法方法__add__,这就形成 ...

--是什么操作符,怎么和+一样的呢。Google了一下也没查到。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 04:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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