运行string定义的类的特定方法

时间:2011-04-26 15:40:37

标签: python

我有这个示例代码

class aaa:

    @staticmethod
    def method(self):
        pass

    @staticmethod
    def method2(self):
        pass

command = 'method'

现在我想运行命令字符串定义的类aaa的方法。我怎么能这样做?非常感谢你。

3 个答案:

答案 0 :(得分:4)

别。很少有理由处理这种方法引入的问题(安全性,清晰度,性能,可以说是可读性......)。只需使用command = aaa.method

如果 使用字符串(希望有充分理由),可以使用getattr,但您应该使用明确的映射来指定所有字符串有效名称(这也使得代码可以防范内部重命名/重构):

methods = {
    'method': aaa.method,
    'method2': aaa.method2,
}
methods[command]()

“没有这个字符串的方法”的情况可以像这样处理:

method = methods.get(command)
if method is None:
    ... # handle error/bail out

答案 1 :(得分:3)

首先,删除self s的staticmethod参数 - staticmethod的全部内容是它们没有self参数。然后,使用

method = getattr(aaa, command)
method()

或只是

getattr(aaa, command)()

调用command命名的方法。

(我只是想知道你为什么不首先简单地使用command = aaa.method,但肯定有应用这是不可能的。)

答案 2 :(得分:1)

您可以使用getattr按名称获取对象的属性。

In [141]: class Foo(object):
   .....:     def frob(self):
   .....:         print "Frobbed"
   .....:         
   .....:         

In [142]: f = Foo()

In [143]: getattr(f, 'frob')
Out[143]: <bound method Foo.frob of <__main__.Foo object at 0x2374350>>

In [144]: _()
Frobbed