6

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

让我们考虑以下类定义:

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()并调用Python,则将作为第一个参数a.f()传递给函数。调用阻止发送它或捕获- 所以必须有一种方法来测试这是否是静态方法。A.fselfa.g()self

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

4

3 回答 3

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

  @staticmethod
  def g():
    return 'this is g'
print(type(A.__dict__['g']))
print(type(A.g))

<class 'staticmethod'>
<class 'function'>
于 2013-01-07T00:08:11.167 回答
5

对于 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
于 2018-05-20T12:24:11.530 回答
4

我需要这个解决方案,并根据@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__))
于 2016-05-10T19:16:59.250 回答