Python3:检查方法是否是静态的

时间:2013-01-06 23:35:00

标签: python python-3.x static static-methods introspection

Simmilar问题(与Python2相关:Python: check if method is static

让我们在类定义之后使用concider:

class A:
  def f(self):
    return 'this is f'

  @staticmethod
  def g():
    return 'this is g'

在Python 3中,不再有instancemethod,一切都是函数,因此与Python 2相关的答案将不再适用。

正如我所说,一切都是功能,所以我们可以调用A.f(0),但我们当然不能调用A.f()(参数不匹配)。但是如果我们创建一个实例a=A()并且我们调用a.f() Python将A.f作为第一个参数传递给函数self。调用a.g()会阻止发送它或捕获self - 因此必须有一种方法来测试这是否是静态方法。

那么我们可以在Python3中检查方法是否被声明为static

2 个答案:

答案 0 :(得分:2)

我需要这个解决方案并根据@root

的答案编写以下内容
def is_method_static(cls, method_name):
    # http://stackoverflow.com/questions/14187973/python3-check-if-method-is-static
    for c in cls.mro():
        if method_name in c.__dict__:
            return isinstance(c.__dict__[method_name], staticmethod)
    raise RuntimeError("Unable to find %s in %s" % (method_name, cls.__name__))

答案 1 :(得分:1)

对于Python 3.2或更高版本,使用inspect.getattr_static()检索属性而不调用描述符协议:

  

通过描述符协议__getattr__()__getattribute__()检索属性而不触发动态查找。

对结果使用isinstance(..., staticmethod)

>>> from inspect import getattr_static
>>> isinstance(getattr_static(A, 'g'), staticmethod)
True

该函数可以处理实例和类,并将为您扫描完整的类层次结构:

>>> class B(A): pass
...
>>> isinstance(getattr_static(B, 'g'), staticmethod)  # inherited
True
>>> isinstance(getattr_static(B(), 'g'), staticmethod)  # instance, inherited
True