关于python:如何使用方法名和类名调用类的静态方法

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


您可以使用getattr两次。第一次出现在包含类的模块上,第二次出现在类本身上

1
2
3
4
5
6
class_name = 'Foo'
method_name = 'Bar'

cls = getattr(mod, clsname)
method = getattr(cls, method_name)
method(args)

这不像建立一个注册表那么灵活(你可以用一个装饰师来做),但是如果你不打算这样做,那么这是一个比处理堆栈更好的选择,而且在风格上,比处理sys.modules干净得多。

注意,模块本身可以不产生任何不利影响。所以这些类不必在不同的模块中才能工作。


下面是一个粗略的方法:

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)

首先,找到班级。在本例中,我使用的是locals(),因为我知道该类在本地字典中可用。如果类不在本地字典中,则此操作将失败。

接下来,找到类的方法。

1
getattr(locals().get(class_name), method_name)

它使用getattr()

最后,调用该方法。

1
getattr(locals().get(class_name), method_name)("bar")

如果可以从当前模块访问类类型,则可以访问globals()dict中的类和使用getattr的方法:

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