yjptx121 发表于 2020-3-28 18:08:21

定制序列的课后题

class Countlist(list):
    def __init__(self, *args):
      super().__init__(args)# 调用基类的__init__方法
      self.count = []   # 赋值一个空列表
      for i in args:      # 为每一个args 设置一个对应的 计数器,初始值均为0,self.count的长度即为*args的长度
            self.count.append(0)    # 初始值为0

    def __len__(self):
      return len(self.count)      # 返回计数器的长度

    def __getitem__(self, key):   # 访问
      self.count += 1      # 每获取一次值,对应的计数器加1,只有在访问时才会增加
      return super().__getitem__(key)   # 调用基类的__getitem__方法

    def __setitem__(self, key, value):      # 赋值
      self.count = value         # 为计数器重新赋值
      return super().__setitem__(key, value)# 调用基类的赋值方法

    def __delitem__(self, key):   # 删除
      del self.count         # 对应的计数端也会被删除
      return super().__delitem__(key)   # 调用基类的删除方法

    def counter(self, key):   # 增加 counter(index)方法,返回 index参数所指定的元素记录的访问次数
      return self.count      # 返回的是对应值的计数器次数,计数器是跟随value 而不是index

    def append(self, value):    # 添加
      self.count.append(0)    # 在添加列表时,同时添加一个计数器
      super().append(value)   # 返回基类的append方法

    def pop(self, key=-1):      # 弹出
      del self.count   # 删除对应位置的计数器, 默认值为最后一个(-1)
      return super().pop(key)   # 调用基类的pop方法

    def remove(self, value):    # 移除value,
      key = super().index(value)# 调用基类的index, 返回值key是value在序列中的位置
      del self.count   # 删除对应位置的计数器
      super().remove(value)   # 调用基类的移除方法

    def insert(self, key, value):   # 插入 value
      self.count.insert(key, 0)      # 在插入value时,在相同的位置插入计数器,初始值为0
      super().insert(key, value)# 调用基类的insert方法

    def clear(self):    # 清除列表
      self.count.clear()      # 同样清除计数器
      super().clear()   # 调用基类的clear方法

    def reverse(self):# 反转列表
      self.count.reverse()    # 同样反转计数器
      super().reverse()   #调用基类的reverse方法

想请教,这里为什么要调用基类的方法

zltzlt 发表于 2020-3-28 18:10:40

如果不调用基类的方法就无法实现对应的功能。

yjptx121 发表于 2020-3-28 20:48:19

zltzlt 发表于 2020-3-28 18:10
如果不调用基类的方法就无法实现对应的功能。

可不可以这样理解,在重写了魔法方法后,要实现重写后的功能就必须依赖基类的方法

zltzlt 发表于 2020-3-29 08:06:28

yjptx121 发表于 2020-3-28 20:48
可不可以这样理解,在重写了魔法方法后,要实现重写后的功能就必须依赖基类的方法

是的,你也可以自己实现,但是相对较麻烦,还是直接扔给基类处理好~

yjptx121 发表于 2020-3-29 21:53:45

zltzlt 发表于 2020-3-29 08:06
是的,你也可以自己实现,但是相对较麻烦,还是直接扔给基类处理好~

多谢解惑

青青草原没有羊 发表于 2020-5-30 17:44:16

1
页: [1]
查看完整版本: 定制序列的课后题