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传递给函数Af
的self
作为第一个参数。 调用ag()
从发送它可以防止或捕获self
-所以必须要进行测试,如果这是静态方法还是没有办法。
所以,我们可以在Python3检查的方法声明为static
或没有?
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'>
我需要这个解决方案,并写了下面的根据来自@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__))
对于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