如何通过其成员函数名称调用Python实例的非特定方法?

时间:2013-05-07 12:01:16

标签: python function member

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

工作者实例将具有多个foo*格式成员函数(foo*函数的数量未知,因为它是由其他开发人员提供的。如何编写函数来调用所有工作者的foo *当用户添加新的foo *函数时,没有修改它的成员函数?

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

1 个答案:

答案 0 :(得分:3)

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

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() function来确保该属性确实是一种方法。

快速演示:

>>> 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