扩展python列表类以对其内容执行其他功能?

时间:2012-01-25 18:34:29

标签: python oop list python-3.x

我想创建一个包含其他对象的对象,并在它拥有的每个对象上调用一个方法。最终目标是为程序生成脚本。每个对象都包含一个可以使用printCommand()打印的命令,最终可以打印到文件中。我最初的解决方案是:

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

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

我创建一个列表变量,将对象添加到列表中,然后循环发出命令。虽然这很有效,但我主要是为了自学编程,所以我想知道是否有更优雅的解决方案,而不是编写代码来追加,弹出等项目到对象中的列表。由于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.LISTCONTENTSlist对象在哪里存储其内容,以及如何从方法中访问它们?

2 个答案:

答案 0 :(得分:1)

(a)不要创建一个名为Object的类,它离object太近了。

(b)绝对没有必要继承list,坦率地说,我怀疑是否需要使用自己的课程。

(c)在列表的每个元素上调用函数的常规方法是使用map。如果需要重复映射相同的函数,可以使用partial将该函数绑定到map的第一个参数。

现在去看一下文档。

答案 1 :(得分:1)

您可以迭代self

超类方法(即__iter__())都存在。在 for 语句的上下文中说self将导致调用相应的方法。

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