鱼C论坛

 找回密码
 立即注册
查看: 1012|回复: 20

[已解决]12.6定制序列课后作业

[复制链接]
发表于 2020-6-18 12:32:19 | 显示全部楼层 |阅读模式

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

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

x
class CountList(list):
    def __init__(self, *args):
        super().__init__(args)
        self.count = []
        for i in args:
            self.count.append(0)

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

    def __getitem__(self, key):
        self.count[key] += 1
        return super().__getitem__(key)

    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):
        self.count.append(0)
        super().append(value)

    def pop(self, key=-1):
        del self.count[key]
        return super().pop(key)

    def remove(self, value):
        key = super().index(value)
        del self.count[key]
        super().remove(value)

    def insert(self, key, value):
        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 reverse(self):
                                self.count.reverse()
                                 super().reverse(),这种self.count.reverse()的作用不就是调用reverse函数  那后面super().reverse()作用不就重复了?这串代码看的好蒙  有没有大佬能详细讲一下 谢谢了
最佳答案
2020-6-18 16:30:50
本帖最后由 Twilight6 于 2020-6-18 16:45 编辑
今天的我更强了 发表于 2020-6-18 16:27
这里的pop 和remove都是super().remove(value),return super().pop(key)  这种调用父类的方法,而不是应 ...


  我输了   看看我们都扯多少时间了

这里的pop 和remove都是super().remove(value),return super().pop(key)  这种调用父类的方法

是为了使我们重写的有原来list 的 功能,
def __delitem__(self, key):

当你容器内元素被删除时候就会被调用!

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

使用道具 举报

发表于 2020-6-18 14:04:14 | 显示全部楼层


这种self.count.reverse()的作用不就是调用reverse函数  那后面super().reverse()作用不就重复了?


我刚刚重新去看了下这节课的课后作业题目,你的问题是上面这个,让我们先认真看下题目:

0. 根据课堂上的例子,定制一个列表,同样要求记录列表中每个元素被访问的次数。

这一次我们希望定制的列表功能更加全面一些,比如支持 append()、pop()、extend() 原生列表所拥有的方法。你应该如何修改呢?


甲鱼老师的代码里 ,重写了的方法都是
self.count.insert(key, 0)
self.count.append(0)
        for i in args:
            self.count.append(0)


重写的方法都是只添加 0  或者 插入 0 的位置参数 ,而 小甲鱼题目要求是在我们重写前提下还能保留原生列表拥有的方法,那么你就应该调用父类的方法,即原生列表的方法

才能使我们重写的方法有原生列表的功能,否则我们重写的方法会覆盖父类原有的方法,不会有原有的功能


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

使用道具 举报

 楼主| 发表于 2020-6-18 14:45:50 | 显示全部楼层
Twilight6 发表于 2020-6-18 14:04
我刚刚重新去看了下这节课的课后作业题目,你的问题是上面这个,让我们先认真看下题目:

def reverse(self):
        self.count.reverse()
        super().reverse()
在运行这一段代码的时候  运行到self.count.reverse()不会调用自身然后无限递归嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 14:54:08 | 显示全部楼层
Twilight6 发表于 2020-6-18 14:49
不会的  因为 self.count 是你初始化时候赋值了一个列表,调用这个方法是列表的方法 不是自身的

你对 ...

这种和魔法方法不一样,魔法方法会自动调用,但这个def reverse(self) 需要实例化 所以不会自动调用吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 14:57:21 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 14:54
这种和魔法方法不一样,魔法方法会自动调用,但这个def reverse(self) 需要实例化 所以不会自动调用吗?


魔法方法也要实例化   才能使用

def reverse(self)  是个函数,或者说是个方法 没有实例化之说

实例化是指类对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 14:59:42 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 14:54
这种和魔法方法不一样,魔法方法会自动调用,但这个def reverse(self) 需要实例化 所以不会自动调用吗?


不过上面一楼我确实说错了,不能说自动调用,确实不会自动调用的,已删除上楼评论


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

使用道具 举报

 楼主| 发表于 2020-6-18 15:09:33 | 显示全部楼层
Twilight6 发表于 2020-6-18 14:59
不过上面一楼我确实说错了,不能说自动调用,确实不会自动调用的,已删除上楼评论

def __setattr__(self,name, value):
   self.name =value
这种会无限递归是因为触发的是魔法方法,会自动调用然后无限递归
但这个例子中不是魔法方法  需要实例化之后调用这个方法才会触发
这样理解对吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 15:16:19 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 15:09
def __setattr__(self,name, value):
   self.name =value
这种会无限递归是因为触发的是魔法方法,会 ...

嗯  你写的是单纯的一个类中的方法,之前我的叙述有误,自己的方法只在实例化后 调用 才能会触发,你说的没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 15:21:01 | 显示全部楼层
Twilight6 发表于 2020-6-18 15:16
嗯  你写的是单纯的一个类中的方法,之前我的叙述有误,自己的方法只在实例化后 调用 才能会触发,你说的 ...

def __delitem__(self, key):
        del self.count[key]
        super().__delitem__(key)
我又发现问题了..课本上说__delitem__(self,key)相当于del self[key]  ,这个地方 def pop(self,key=-1)触发del self.count[key] 然后自动调用上面的魔法方法,然后运行到del self.count[key] 不是又无限递归了?  
我好想被无限递归整蒙圈了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 15:32:15 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 15:21
def __delitem__(self, key):
        del self.count[key]
        super().__delitem__(key)

课本上说__delitem__(self,key)相当于del self[key]


就是触发时候相当于用 del 是等效的  简单理解就是 容器去除元素时候等于自动调用 __delitem__(self,key) 来通过 del self[key] 删除元素,而用 del self[key] 不会再次触发 __delitem__(self,key) 这样可以理解呗~,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 15:36:44 | 显示全部楼层
Twilight6 发表于 2020-6-18 15:32
就是触发时候相当于用 del 是等效的  简单理解就是 容器去除元素时候等于自动调用 __delitem__(self, ...

重点就是理解不了为什么不会再次触发
def __setattr__(self,name,value):
        super().__setattr__(name,value)
        self.counter+=1
这两个代码不是差不多吗?  这个到 self.counter+=1 然后自动触发魔法方法,不是同一个道理吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 15:46:36 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 15:36
重点就是理解不了为什么不会再次触发
def __setattr__(self,name,value):
        super().__setattr__ ...



有差别呀,你实在不行就记住 del 不会调用 __delitem__(self,key) 这个方法就行

资料说  __delitem__(self,key) 等价 del 那你就这样理解,del 是直接使用 __delitem__(self,key) 这个功能 而不是使用类方法的 __delitem__(self,key)

__setattr__ 只要是类或实例对象的赋值就会自动调用

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

使用道具 举报

 楼主| 发表于 2020-6-18 16:04:59 | 显示全部楼层
Twilight6 发表于 2020-6-18 15:46
有差别呀,你实在不行就记住 del 不会调用 __delitem__(self,key) 这个方法就行

资料说  __delit ...

如果不会调用的话 那def __delitem__(self,key) 这段代码写的意义不就没了? 问题有点多 主要是想弄明白 不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 16:06:28 | 显示全部楼层
本帖最后由 Twilight6 于 2020-6-18 16:10 编辑
今天的我更强了 发表于 2020-6-18 16:04
如果不会调用的话 那def __delitem__(self,key) 这段代码写的意义不就没了? 问题有点多 主要是想弄明白  ...


只有 del 不会调用啊....pop remove 都会呀。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 16:15:23 | 显示全部楼层
Twilight6 发表于 2020-6-18 16:06
只有 del 不会调用啊....pop remove 都会呀。。。

就是说他俩是等价的关系 而不是调用与被调用的关系吗?
可是后面用到的pop remove 都是调用的父类的 也就是list的啊 与这个不是没有关系吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 16:16:35 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 16:15
就是说他俩是等价的关系 而不是调用与被调用的关系吗?
可是后面用到的pop remove 都是调用的父类的 也 ...

对的  pop remove 都属于列表的方法 而且你的类是继承列表的

del 不是列表的专有 , del 几乎什么对象都可以删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 16:27:32 | 显示全部楼层
Twilight6 发表于 2020-6-18 16:16
对的  pop remove 都属于列表的方法 而且你的类是继承列表的

del 不是列表的专有 , del 几乎什么对 ...

这里的pop 和remove都是super().remove(value),return super().pop(key)  这种调用父类的方法,而不是应用自身的魔法方法 那就应该不会调用自身的 def __delitem__(self, key):  魔法方法吧? 那岂不是没有用到...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 16:30:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-18 16:45 编辑
今天的我更强了 发表于 2020-6-18 16:27
这里的pop 和remove都是super().remove(value),return super().pop(key)  这种调用父类的方法,而不是应 ...


  我输了   看看我们都扯多少时间了

这里的pop 和remove都是super().remove(value),return super().pop(key)  这种调用父类的方法

是为了使我们重写的有原来list 的 功能,
def __delitem__(self, key):

当你容器内元素被删除时候就会被调用!

休息去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 16:32:49 | 显示全部楼层
Twilight6 发表于 2020-6-18 16:30
我输了  这个最佳我不要了  我最后回答你一次  看看我们都扯多少时间了

给您添麻烦了 不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 16:34:12 | 显示全部楼层
今天的我更强了 发表于 2020-6-18 16:32
给您添麻烦了 不好意思

你重写了会覆盖原有的 list 的 insert 或者 remove 之类的功能

我们这里只是添加了一部分功能 而不是想要完全重写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 10:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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