Python3:检查方法是静态的(Python3: check if method is stati

2019-07-17 22:04发布

Simmilar问题(与Python2相关: Python的:检查方法是静态的 )

让海外商品会有下面的类定义:

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

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

在Python 3没有instancemethod了,一切功能,因此与Python的2答案将不再工作。

正如我告诉,一切都是函数,所以我们可以称之为Af(0)但当然我们不能称之为Af()参数missmatch)。 但是,如果我们做一个实例a=A()我们称之为af()的Python传递给函数Afself作为第一个参数。 调用ag()从发送它可以防止或捕获self -所以必须要进行测试,如果这是静态方法还是没有办法。

所以,我们可以在Python3检查的方法声明为static或没有?

Answer 1:

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'>


Answer 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__))


Answer 3:

对于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


文章来源: Python3: check if method is static