扩展Python列表类以执行额外功能?
我想创建一个对象,这个对象可以存放其他对象,并且可以对每个存放的对象调用一个方法。最终的目标是生成一个程序的脚本。每个对象里面都有一个命令,可以通过 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