Расширение класса списка Python для выполнения дополнительных функций над его содержимым? - PullRequest
2 голосов
/ 25 января 2012

Я хочу создать объект, который будет содержать другие объекты, и вызвать метод для каждого из объектов, которые он содержит. Конечная цель - создать скрипт для программы. Каждый объект содержит команду, которая может быть напечатана с помощью printCommand(), в конечном итоге в файл. Мое оригинальное решение было таким:

a = ObjectList()
a.appendObject(Object())
b = ObjectList()
b.appendObject(Object())

listOfObjects = [a, b]
for Object in listOfObjects:
    Object.printCommand()

Я создаю переменную списка, добавляю объекты в список thw, затем зацикливаюсь на нем, выдавая команду. Хотя это работает, я в основном делаю это упражнение для обучения программированию, поэтому я хочу знать, есть ли более элегантное решение, чем написание кода для добавления, выталкивания и т. Д. Элементов в список объекта. Поскольку list уже содержит эти функции, я подумал, что правильной вещью будет расширение list:

class Object:
    def __init__(self):
        self.Command = "Script Command"

    def printCommand(self):
        print(self.Command)

class ObjectList(list):
    def printCommand(self):
        for Object in self.LISTCONTENTS:
            Object.printCommand()

Тем не менее, я в недоумении относительно того, как бы я сказал ему перебирать его собственное содержимое. Что принадлежит на self.LISTCONTENTS? Где объект list хранит его содержимое и как вы получаете к нему доступ из метода?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Вы можете просто перебрать self:

Методы суперкласса (то есть, __iter__()) все присутствуют.Сказать self в контексте оператора for вызовет соответствующие методы.

class Object:
    def __init__(self):
        self.Command = "Script Command"

    def printCommand(self):
        print(self.Command)

class ObjectList(list):
    def printCommand(self):
        for Object in self:
            Object.printCommand()

lst = ObjectList()
lst.append(Object())
lst.append(Object())

lst.printCommand()

Способ, которым это работает, list реализует __iter__, который вызываетсяза кадром при переборе объекта:

>>> for e in [1,2,3].__iter__():
...  print(e)
... 
1
2
3
>>> for e in [1,2,3]:
...  print(e)
... 
1
2
3
1 голос
/ 25 января 2012

(a) Никогда не создавайте класс с именем Object, это слишком близко к object.

(b) Нет абсолютно никакой необходимости наследовать от list, и, честно говоря, я сомневаюсь, что вообще нужно использовать свой собственный класс.

(c) Обычный способ вызова функции для каждого элемента списка - использовать map. Если вам нужно отображать одну и ту же функцию несколько раз, вы можете использовать partial, чтобы связать эту функцию с первым аргументом map.

Теперь посмотрите документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...