扩展Python列表类以执行额外功能?

2 投票
2 回答
1775 浏览
提问于 2025-04-17 11:04

我想创建一个对象,这个对象可以存放其他对象,并且可以对每个存放的对象调用一个方法。最终的目标是生成一个程序的脚本。每个对象里面都有一个命令,可以通过 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.LISTCONTENTS 应该放什么呢?一个 list 对象是在哪里存储它的内容的,如何从一个方法中访问这些内容呢?

2 个回答

1

(a) 不要创建一个叫做 Object 的类,这个名字太接近 object 了。

(b) 其实没有必要去继承 list,说实话,我觉得你可能根本不需要用自己的类。

(c) 如果你想对列表里的每个元素都执行一个函数,通常的做法是用 map。如果你需要反复用同一个函数,可以用 partial 把这个函数绑定到 map 的第一个参数上。

现在去看看文档吧。

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

撰写回答