通过定义新类访问列表名称,错误:NamedList 实例没有属性 '__len__'

0 python ironpython class list

我对 python 很陌生,所以我创建了一个元素列表,如:

main_list = [1,2,3]
Run Code Online (Sandbox Code Playgroud)

我希望这个列表有一个名字,但我不想使用字典,所以我创建了一个以名字作为属性的类:

class NamedList:
     def __init__(self, name, obj)
          self.name = name
          self.object = obj
Run Code Online (Sandbox Code Playgroud)

当我尝试访问第一个列表的长度时:

len(main_list)   #works fine
Run Code Online (Sandbox Code Playgroud)

但对于第二个,它给了我这个

错误:NamedList 实例没有属性“ len ”:

new_main_list = NamedList('numbers', main_list)
len(new_main_list)      #This line gives me the error
Run Code Online (Sandbox Code Playgroud)

我想知道为什么 List 类的基本属性对我的类不可用?我所有的实例最初都是一个 List 实例。

提前致谢

gil*_*lch 5

您可以创建一个 的子类,list它将继承所有列表方法,包括.__len__().

class NamedList(list):
    def __init__(self, name, iterable):
        super().__init__(iterable)
        self.name = name
Run Code Online (Sandbox Code Playgroud)

所有的实例最初都是列表实例,那么为什么列表类的方法对它们不起作用,为什么我必须定义一个子类?

一个列表属性是不一样的列表。想想len()如果您有多个列表属性或没有列表应该怎么做。您没有公开所需的接口。该len()内建的工作原理是调用.__len__()的对象,但你的原班没有这个方法。相反,它已经.object.__len__(),换句话说,它有一个列表对象,并认为有必要的方法。len(new_main_list)不工作,但len(new_main_list.object)会。

另一方面,子类继承其父类 ( list)的属性。如果属性查找NamedList失败,它将尝试在 上查找它list,它有.__len__(),所以它可以工作。