How to call a static method of a class using method name and class name
从这样的类开始:
1 2 3 4 | class FooClass(object): @staticmethod def static_method(x): print x |
通常,我调用类的静态方法时使用:
1 | FooClass.static_method('bar') |
是否可以调用只有类名和方法名的静态方法?
1 2 | class_name = 'FooClass' method_name = 'static_method' |
您不应该像其他答案中建议的那样处理locals()。如果您的类名是一个字符串,并且需要解析它,请使用某种类型的注册表。字典会很好用的。例如。
1 2 3 4 5 6 | class FooClass(object): @staticmethod def static_method(x): print x registry = {'FooClass':FooClass} |
(我假设您希望向这个注册表添加更多的类)
然后查找就变得非常简单:
1 | getattr(registry['FooClass'], 'static_method')("bar") |
您可以使用
1 2 3 4 5 6 | class_name = 'Foo' method_name = 'Bar' cls = getattr(mod, clsname) method = getattr(cls, method_name) method(args) |
这不像建立一个注册表那么灵活(你可以用一个装饰师来做),但是如果你不打算这样做,那么这是一个比处理堆栈更好的选择,而且在风格上,比处理
注意,模块本身可以不产生任何不利影响。所以这些类不必在不同的模块中才能工作。
下面是一个粗略的方法:
1 2 3 4 5 6 7 8 9 10 | >>> class FooClass(object): @staticmethod def static_method(x): print x >>> class_name = 'FooClass' >>> method_name = 'static_method' >>> getattr(locals().get(class_name), method_name)("bar") bar |
分手:
1 | locals().get(class_name) |
首先,找到班级。在本例中,我使用的是
接下来,找到类的方法。
1 | getattr(locals().get(class_name), method_name) |
它使用
最后,调用该方法。
1 | getattr(locals().get(class_name), method_name)("bar") |
如果可以从当前模块访问类类型,则可以访问
1 2 3 4 5 6 7 8 9 | class FooClass(object): @staticmethod def static_method(x): print x class_name = 'FooClass' method_name = 'static_method' getattr(globals()[class_name], method_name)("test") |