今天的我更强了 发表于 2020-6-18 11:37:51

12.6定制序列里的__len__魔法方法

代码如下:
class Count:
    def __init__(self,*num):
      self.list1=
      self.dict1={}.fromkeys(range(len(self.list1)),0)
    def __len__(self):
      super(). __len__(self.list1)
    def __getitem__(self,key):
      self.dict1+=1
      return self.list1
    def __setitem__(self,key,value):
      self.dict1=0
      self.list1.append(value)
    def __delitem__(self,key):
      self.dict1.pop(key)
      self.list1.pop(key)
      self.dict1=dict(zip(list(range(len(self.list1))),list(self.dict1.values)))
    def reverse(self):
      self.list1.reverse()
      list2=list(self.dict1.values).reverse()
      self.dict1=dict(zip(list(range(len(self.list1))),list2))
    def counter(self,key):
      return self.dict1
为什么def __len__(self):
      super(). __len__(self.list1)   会报错显示AttributeError: 'super' object has no attribute '__len__'?有没有大神知道的
      

Twilight6 发表于 2020-6-18 11:44:54



这样就不会报错了:
class Count:
    def __init__(self,*num):
      self.list1=
      self.dict1={}.fromkeys(range(len(self.list1)),0)
    def __len__(self):
      print('自动调用了 len 方法~')
      return self.list1.__len__()
    def __getitem__(self,key):
      self.dict1+=1
      return self.list1
    def __setitem__(self,key,value):
      self.dict1=0
      self.list1.append(value)
    def __delitem__(self,key):
      self.dict1.pop(key)
      self.list1.pop(key)
      self.dict1=dict(zip(list(range(len(self.list1))),list(self.dict1.values)))
    def reverse(self):
      self.list1.reverse()
      list2=list(self.dict1.values).reverse()
      self.dict1=dict(zip(list(range(len(self.list1))),list2))
    def counter(self,key):
      return self.dict1
c = Count(1,2,3,4,5)
print(len(c))

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

Twilight6 发表于 2020-6-18 11:44
这样就不会报错了:

这是为什么啊

Twilight6 发表于 2020-6-18 12:35:05

本帖最后由 Twilight6 于 2020-6-18 13:29 编辑

今天的我更强了 发表于 2020-6-18 12:12
这是为什么啊

具体我也不知道,刚刚去查了资料也没查到什么说明

只是调用 len 函数时候会自动调用 __len__ 方法,你可以重写随意设置返回值多少

Stubborn 发表于 2020-6-18 16:53:12

直接用len函数, return len(obj)

_荟桐_ 发表于 2020-6-18 17:29:57

没有指定继承的类时会默认继承object类

所以Count继承于object,而object没有__len__方法
所以用super().__len__(self.list1)就会报错

如果是
return self.list1.__len__()
因为self.list1是list类的实例,而list有__len__方法
所以这个代码就是调用了list类的__len__方法
不会报错
页: [1]
查看完整版本: 12.6定制序列里的__len__魔法方法