【问题标题】:Accessing the name of a list by defining a new class, error: NamedList instance has no attribute '__len__'通过定义新类访问列表的名称,错误:NamedList 实例没有属性'__len__'
【发布时间】:2020-06-11 02:43:23
【问题描述】:

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

main_list = [1,2,3]

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

class NamedList:
     def __init__(self, name, obj)
          self.name = name
          self.object = obj

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

len(main_list)   #works fine

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

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

new_main_list = NamedList('numbers', main_list)
len(new_main_list)      #This line gives me the error

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

提前致谢

【问题讨论】:

  • 为你的NamedList 类实现一个__len__ 方法。

标签: python list class ironpython


【解决方案1】:

__len__ 方法添加到您的类中,例如,

def __len__(self):
    return len(self.obj) # or return self.obj.__len__()

【讨论】:

    【解决方案2】:

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

    class NamedList(list):
        def __init__(self, name, iterable):
            super().__init__(iterable)
            self.name = name
    

    原来所有的实例都是list实例,为什么list类的方法对它们不起作用,为什么还要定义一个子类呢?

    拥有列表属性与成为列表不同。如果您有多个列表属性或没有列表,请考虑len() 应该做什么。您没有公开所需的界面。 len() 内置函数通过在对象上调用 .__len__() 来工作,但是您的原始类没有该方法。相反,它有.object.__len__(),换句话说,它有一个列表对象并且那个 有所需的方法。 len(new_main_list) 不起作用,但 len(new_main_list.object) 可以。

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

    【讨论】:

    • 感谢您的建议,我猜这种方法是最好的方法。它工作得很好。只是出于好奇,为什么我必须定义一个子类?因为正如我所说的所有实例最初都是列表实例,那么为什么列表类的方法对它们不起作用以及为什么我必须定义一个子类?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2014-04-07
    • 2016-01-31
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多