鱼C论坛

 找回密码
 立即注册
查看: 1269|回复: 7

[已解决]关与类继承中是否引起递归调用的疑惑

[复制链接]
发表于 2019-8-25 20:11:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 介左来了 于 2019-8-25 20:13 编辑

第047讲中,对list类进行重写的时候,涉及到reverse(),insert(),__setitem__(self,key,value)等方法时,如果在方法中有引用自身,不会出现递归调用吗?

源码如下:

  1. class CountList(list):
  2.     def __init__(self, *args):
  3.         super().__init__(args)
  4.         self.count = []
  5.         for i in args:
  6.             self.count.append(0)
  7.    
  8.     def __setitem__(self, key, value):
  9.         #此处调用列表中的元素,不是会自动调用了 __setitem__(self, key, value) 魔法方法吗?为何实际运行的时候不会出现递归调用?
  10.         self.count[key] += 1   
  11.         super().__setitem__(key, value)

  12.     def insert(self, key, value):
  13.         #此处调用了自身的函数insert(),不会引起递归调用吗?
  14.         self.count.insert(key, 0)
  15.         super().insert(key, value)   

  16.     def clear(self):
  17.         #此处调用了自身的函数clear(),不会引起递归调用吗?
  18.         self.count.clear()
  19.         super().clear()

  20.     def reverse(self):
  21.         #此处调用了自身的函数reverse(),不会引起递归调用吗?
  22.         self.count.reverse()
  23.         super().reverse()
复制代码


以上几处,比较困惑,请大佬们解答一下,谢谢了。
最佳答案
2019-8-25 22:09:24
它并没有调用自身啊!!
self.count.insert(key, 0)
好好看看代码,只有实例对象调用其类中定义方法才会去找其对应方法,是CountList类的实例对象去调用方法insert
而这是self.count.insert(key, 0),这是实例对象的属性去调用insert方法,但是self.count这就是一个列表对象,它可不是这个类的实例对象,它用的inseert()方法是python自带的list类中定义的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-25 20:20:20 | 显示全部楼层
self.count[key] += 1 是调用 self.count.__setitem__(key, 1),不会引起递归。
self.count.reverse() 是调用自身列表的方法,不会引起递归。self.count.clear()、self.count.insert() 同理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-25 22:09:24 | 显示全部楼层    本楼为最佳答案   
它并没有调用自身啊!!
self.count.insert(key, 0)
好好看看代码,只有实例对象调用其类中定义方法才会去找其对应方法,是CountList类的实例对象去调用方法insert
而这是self.count.insert(key, 0),这是实例对象的属性去调用insert方法,但是self.count这就是一个列表对象,它可不是这个类的实例对象,它用的inseert()方法是python自带的list类中定义的方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-25 22:15:42 | 显示全部楼层
如上面说的,self.insert()   self.clear()   self.reverse()才会调用自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-8-26 08:18:40 | 显示全部楼层
不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-26 08:46:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-26 22:18:10 | 显示全部楼层
zltzlt 发表于 2019-8-25 20:20
self.count[key] += 1 是调用 self.count.__setitem__(key, 1),不会引起递归。
self.count.reverse() 是 ...

懂了,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-26 22:19:29 | 显示全部楼层
都淡忘 发表于 2019-8-25 22:09
它并没有调用自身啊!!
self.count.insert(key, 0)
好好看看代码,只有实例对象调用其类中定义方法才会 ...

谢谢,说的很清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 10:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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