1
class worker:
    def foo(self):
        pass
    def foo1(self):
        pass
    def foo2(self)
        pass

worker 实例会有几个foo*格式的成员函数(函数的数量foo*不知道,因为它是由其他开发人员提供的。当用户添加新的 foo* 函数时,如何编写一个函数来调用所有 worker 的 foo* 成员函数而不修改它?

我可以通过调用获取所有工作实例函数名称列表dir(),但它的元素是 str,我无法仅通过字符串值运行工作实例。我怎么能解决这个问题?

4

1 回答 1

3

使用该getattr()函数从实例访问任意属性。使用该dir()函数列出类的所有(继承的)属性。结合这些使得:

foo_attributes = [attr for attr in dir(instance) if attr.startswith('foo')]
for name in foo_attributes:
    attr = getattr(instance, name)
    if callable(attr):
        attr()

我在这里使用了callable()函数来确保属性确实是一个方法。

快速演示:

>>> class worker:
...     def foo(self):
...         print "Called foo"
...     def foo1(self):
...         print "Called foo1"
...     def foo2(self):
...         print "Called foo2"
... 
>>> instance = worker()
>>> foo_attributes = [attr for attr in dir(instance) if attr.startswith('foo')]
>>> for name in foo_attributes:
...     attr = getattr(instance, name)
...     if callable(attr):
...         attr()
... 
Called foo
Called foo1
Called foo2
于 2013-05-07T12:06:03.097 回答