При обращении к имени списка путем определения нового класса ошибка: экземпляр NamedList не имеет атрибута __len__ - PullRequest
0 голосов
/ 27 февраля 2020

Я довольно новичок в 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

Я хотел знать, почему основ c атрибуты класса List недоступны для моего класса? все мои экземпляры изначально являются экземплярами List.

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 27 февраля 2020

Вы можете создать подкласс list, и он будет наследовать все методы списка, включая .__len__().

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

все экземпляры изначально являются экземплярами списка, так почему методы класса списка для них не работают, и почему я должен определить подкласс?

Наличие атрибута списка не совпадает с , являющимся a список. Подумайте о том, что len() должен делать, если у вас есть несколько атрибутов списка или нет списков. Вы не выставляли требуемый интерфейс. Встроенная функция len() работает, вызывая .__len__() объекта, но ваш исходный класс не имел этого метода. Вместо этого у него есть .object.__len__(), другими словами, у него есть объект списка, а у есть требуемый метод. len(new_main_list) не работает, но len(new_main_list.object) будет иметь.

С другой стороны, подкласс наследует атрибуты своего родительского класса (list). Если поиск атрибута на NamedList завершится неудачно, он попытается найти его на list, который имеет .__len__(), поэтому он работает.

4 голосов
/ 27 февраля 2020

Добавьте __len__ метод к вашему классу как,

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