今天的我更强了 发表于 2020-6-18 12:32:19

12.6定制序列课后作业

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 += 1
      return super().__getitem__(key)

    def __setitem__(self, key, value):
      self.count += 1
      super().__setitem__(key, value)

    def __delitem__(self, key):
      del self.count
      super().__delitem__(key)

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

    def append(self, value):
      self.count.append(0)
      super().append(value)

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

    def remove(self, value):
      key = super().index(value)
      del self.count
      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()作用不就重复了?这串代码看的好蒙有没有大佬能详细讲一下 谢谢了

Twilight6 发表于 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 的位置参数 ,而 小甲鱼题目要求是在我们重写前提下还能保留原生列表拥有的方法,那么你就应该调用父类的方法,即原生列表的方法

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


今天的我更强了 发表于 2020-6-18 14:45:50

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




def reverse(self):
      self.count.reverse()
      super().reverse()
在运行这一段代码的时候运行到self.count.reverse()不会调用自身然后无限递归嘛?

今天的我更强了 发表于 2020-6-18 14:54:08

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

你对 ...

这种和魔法方法不一样,魔法方法会自动调用,但这个def reverse(self) 需要实例化 所以不会自动调用吗?

Twilight6 发表于 2020-6-18 14:57:21

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

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

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

实例化是指类对象

Twilight6 发表于 2020-6-18 14:59:42

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

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


今天的我更强了 发表于 2020-6-18 15:09:33

Twilight6 发表于 2020-6-18 14:59
不过上面一楼我确实说错了,不能说自动调用,确实不会自动调用的,已删除上楼评论

def __setattr__(self,name, value):
   self.name =value
这种会无限递归是因为触发的是魔法方法,会自动调用然后无限递归
但这个例子中不是魔法方法需要实例化之后调用这个方法才会触发
这样理解对吗?

Twilight6 发表于 2020-6-18 15:16:19

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

嗯你写的是单纯的一个类中的方法,之前我的叙述有误,自己的方法只在实例化后 调用 才能会触发,你说的没错

今天的我更强了 发表于 2020-6-18 15:21:01

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

def __delitem__(self, key):
      del self.count
      super().__delitem__(key)
我又发现问题了..课本上说__delitem__(self,key)相当于del self,这个地方 def pop(self,key=-1)触发del self.count 然后自动调用上面的魔法方法,然后运行到del self.count 不是又无限递归了?
我好想被无限递归整蒙圈了

Twilight6 发表于 2020-6-18 15:32:15

今天的我更强了 发表于 2020-6-18 15:21
def __delitem__(self, key):
      del self.count
      super().__delitem__(key)


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

就是触发时候相当于用 del 是等效的简单理解就是 容器去除元素时候等于自动调用 __delitem__(self,key) 来通过 del self 删除元素,而用 del self 不会再次触发 __delitem__(self,key) 这样可以理解呗~,

今天的我更强了 发表于 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 然后自动触发魔法方法,不是同一个道理吗?

Twilight6 发表于 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__ 只要是类或实例对象的赋值就会自动调用

今天的我更强了 发表于 2020-6-18 16:04:59

Twilight6 发表于 2020-6-18 15:46
有差别呀,你实在不行就记住 del 不会调用 __delitem__(self,key) 这个方法就行

资料说__delit ...

如果不会调用的话 那def __delitem__(self,key) 这段代码写的意义不就没了? 问题有点多 主要是想弄明白 不好意思

Twilight6 发表于 2020-6-18 16:06:28

本帖最后由 Twilight6 于 2020-6-18 16:10 编辑

今天的我更强了 发表于 2020-6-18 16:04
如果不会调用的话 那def __delitem__(self,key) 这段代码写的意义不就没了? 问题有点多 主要是想弄明白...

只有 del 不会调用啊....pop remove 都会呀。。。

今天的我更强了 发表于 2020-6-18 16:15:23

Twilight6 发表于 2020-6-18 16:06
只有 del 不会调用啊....pop remove 都会呀。。。

就是说他俩是等价的关系 而不是调用与被调用的关系吗?
可是后面用到的pop remove 都是调用的父类的 也就是list的啊 与这个不是没有关系吗?

Twilight6 发表于 2020-6-18 16:16:35

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

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

del 不是列表的专有 , del 几乎什么对象都可以删除

今天的我更强了 发表于 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):魔法方法吧? 那岂不是没有用到...

Twilight6 发表于 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)这种调用父类的方法,而不是应 ...

{:10_266:}我输了   看看我们都扯多少时间了

这里的pop 和remove都是super().remove(value),return super().pop(key)这种调用父类的方法
是为了使我们重写的有原来list 的 功能,
def __delitem__(self, key):
当你容器内元素被删除时候就会被调用!

{:10_266:}{:10_266:}{:10_266:}{:10_266:} 休息去了

今天的我更强了 发表于 2020-6-18 16:32:49

Twilight6 发表于 2020-6-18 16:30
我输了这个最佳我不要了我最后回答你一次看看我们都扯多少时间了




给您添麻烦了 不好意思

Twilight6 发表于 2020-6-18 16:34:12

今天的我更强了 发表于 2020-6-18 16:32
给您添麻烦了 不好意思

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

我们这里只是添加了一部分功能 而不是想要完全重写 {:10_266:}
页: [1] 2
查看完整版本: 12.6定制序列课后作业