鱼C论坛

 找回密码
 立即注册
查看: 1664|回复: 2

关于魔法方法,越学越蒙。。。求助!

[复制链接]
发表于 2018-3-11 17:44:22 | 显示全部楼层 |阅读模式

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

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

x
class CountList(list):   #继承的基类是:list
    def __init__(self,*args):   #可以输入多个元素
        super().__init__(args)    #对super().这个方法还是不是很掌握
        self.count = []
        for i in args:
            self.count.append(0)       #slef.count 记录访问次数,初始化为0

    def __len__(self):
        return len(self.count)

    def __getitem__(self,key):
        self.count[key] += 1
        return super().__getitem__(key)  #这里需要使用父类的方法,如果使用__getitem__()这个方法的话,会进入死循环


    def __setitem__(self,key,value):
        self.count[key] += 1
        super().__setitem__(key,value)  #方法同上

    def __delitem__(self,key):
        del self.count[key]
        super().__delitem__(key)  #这里为什么还要调用父类的方法

    def counter(self,key):
        return self.count[key]

    def append(self,value):    #新增一个访问元素>>> value
        self.count.append(0)   #新增加的元素访问次数为0
        super().append(value)   #用基类的方法将元素放到self.count列表里面
        
    def pop(self,key=-1):   #key=-1,默认是间列表最后一个元素踢掉
        del self.count[key]   
        return super().pop(key)

    def remove(self,value):
        key = super().index(value)   #使用基类的方法搜索value在列表中的index
        del self.count[key]
        super().remove(value)

    def insert(self,key,value):   #insert(A,b) 意思是在列表A这个位置插入b这个元素
        self.count.insert(key,0)
        super().insert(key,value)

    def clear(self):
        self.count.clear()   
        super().clear()

    def reverse(self):
        self.count.reverse()
        super().reverse()


问题是:def clear(self):
       1、 self.count.clear()   
       2、 super().clear()
       1与2不是重复了操作吗?一个是类的方法,一个基类的方法,效果都一样?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-11 17:59:18 | 显示全部楼层
super().__init__(args)  #super().是调用父类的方法
self.count.clear()     #这个是清空列表你之前定义的列表
super().clear() #这个是调用父类的清空函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-11 19:55:55 | 显示全部楼层
这是你自己写的吗?你提的这个问题是确实没有重复了,这么写,类中的super继承了list,所以super它针对的完全是类的实例化对象本身,比如我实例化一个对象.
lst = CountList(1,2,3,4),那么lst = [1,2,3,4]
这里用   lst.clear(),它的第一步是执行 lst.count.clear(),      回头看下lst.count是什么,在你创建这个对象时,它就同时被创建出来了,在__init__方法里面,可以看到它的创建,lst.count此时就是[0,0,0,0],所以这一步执行的是将lst.count清空变成[]
下一句super.clear(),它调用的就是list这个基类的方法,那么在list基类里面clear()的作用是清空基类super.__init__()创建的列,所以在这里,clear()清空的是 lst 的实例化对象本身列表[1,2,3,4],而不是__init__里面创建的特例 lst.count,[0,0,0,0]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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