从这样的课开始:
class FooClass(object):
@staticmethod
def static_method(x):
print x
通常,我会用以下方法调用类的静态方法:
FooClass.static_method('bar')
是否可以调用仅具有类名和方法名的静态方法?
class_name = 'FooClass'
method_name = 'static_method'
答案 0 :(得分:8)
你不应该像其他答案中所建议的那样混淆locals()。如果您将类名作为字符串并需要解析它,请使用某种类型的注册表。字典可以正常工作。 E.g。
class FooClass(object):
@staticmethod
def static_method(x):
print x
registry = {'FooClass':FooClass}
(我假设您将要向此注册表添加更多类)
然后查找变得几乎无关紧要:
getattr(registry['FooClass'], 'static_method')("bar")
答案 1 :(得分:2)
以下是粗略方式:
>>> 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
解体:
locals().get(class_name)
首先,找到班级。在这种情况下,我使用locals()
因为我知道该类在本地字典中可用。如果该类不在本地字典中,则会失败。
接下来,找到该类的方法。
getattr(locals().get(class_name), method_name)
这使用getattr()
。
最后,调用方法。
getattr(locals().get(class_name), method_name)("bar")
答案 2 :(得分:2)
您可以使用getattr
两次。第一次在包含类的模块上,第二次在类本身上
class_name = 'Foo'
method_name = 'Bar'
cls = getattr(mod, clsname)
method = getattr(cls, method_name)
method(args)
这不像构建一个注册表那样灵活(你可以用装饰器来做),但是如果你不打算这样做,那么这比一个远更好的选择,而不是搞乱堆栈而且风格上比使用sys.modules
更加干净。
请注意,模块可以import
本身,没有任何不利影响。所以这些类不必在不同的模块中就可以工作。
答案 3 :(得分:1)
如果可以从当前模块访问类类型,则可以使用globals()
访问getattr
dict中的类和方法:
class FooClass(object):
@staticmethod
def static_method(x):
print x
class_name = 'FooClass'
method_name = 'static_method'
getattr(globals()[class_name], method_name)("test")