如何区分Python中的类和静态方法并返回一个布尔值

How to distinguish between class and static methods in Python and return a Boolean

类似于如何在python 3中区分实例方法、类方法、静态方法或函数?,我想确定给定的方法是类方法还是静态方法。

在这个答案中,描述了如何打印type以确定这一点。例如,

1
2
3
4
5
6
7
8
9
10
11
12
class Resource(object):
    @classmethod
    def parse_class(cls, string):
        pass

    @staticmethod
    def parse_static(string):
        pass

# I would like to turn these print statements into Booleans
print type(Resource.__dict__['parse_class'])
print type(Resource.__dict__['parse_static'])

打印输出

1
2
<type 'classmethod'>
<type 'staticmethod'>

不过,我想更进一步,为一个方法是类还是静态方法编写一个布尔表达式。

你知道怎么做吗?(我看过types模块,但没有一个类型像classmethodstaticmethod)。


关键词staticmethodclassmethod代表同名类型:

1
2
3
4
5
6
7
8
9
10
11
In [1]: staticmethod.__class__
Out[1]: type

In [2]: type(staticmethod)
Out[2]: type

In [3]: classmethod.__class__
Out[3]: type

In [4]: type(classmethod)
Out[4]: type

这意味着您可以使用它们来比较您在示例中打印的语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [5]: class Resource(object):
   ...:     @classmethod
   ...:     def parse_class(cls, string):
   ...:         pass
   ...:
   ...:     @staticmethod
   ...:     def parse_static(string):
   ...:         pass
   ...:    

 In [6]: print type(Resource.__dict__['parse_class']) == classmethod
 True

 In [7]: print type(Resource.__dict__['parse_static']) == staticmethod
 True

干杯!


你想要:

1
2
isinstance(vars(Resource)['parse_class'], classmethod)
isinstance(vars(Resource)['parse_static'], staticmethod)

使用vars(my_object)只是访问my_object.__dict__的一种更清洁的方式。


inspect模块似乎给出了预期的结果:

1
2
3
4
import inspect

inspect.ismethod(Resource.parse_class)
inspect.ismethod(Resource.parse_static)

第一个返回True,而第二个返回False

或使用types

1
2
3
4
import types

isinstance(Resource.parse_class, MethodType)
isinstance(Resource.parse_static, MethodType)


类型仅为classmethodstaticmethod,因此如果要执行typeisinstance检查,classmethodstaticmethod是要使用的类型。