如何使用方法名和类名调用类的静态方法

时间:2010-10-03 11:36:34

标签: python

从这样的课开始:

class FooClass(object):
    @staticmethod
    def static_method(x):
        print x

通常,我会用以下方法调用类的静态方法:

FooClass.static_method('bar')

是否可以调用仅具有类名和方法名的静态方法?

class_name = 'FooClass'
method_name = 'static_method'

4 个答案:

答案 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")