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
?
答案 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