Simmilar question (related with Python2: Python: check if method is static)
Lets concider following class definition:
class A:
def f(self):
return 'this is f'
@staticmethod
def g():
return 'this is g'
In Python 3 there is no instancemethod
anymore, everything is function, so the answer related to Python 2 will not work anymore.
As I told, everything is function, so we can call A.f(0)
, but of course we cannot call A.f()
(argument missmatch). But if we make an instance a=A()
and we call a.f()
Python passes to the function A.f
the self
as first argument. Calling a.g()
prevents from sending it or captures the self
- so there have to be a way to test if this is staticmethod or not.
So can we check in Python3 if a method was declared as static
or not?
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'>
For Python 3.2 or newer, use inspect.getattr_static()
to retrieve the attribute without invoking the descriptor protocol:
Retrieve attributes without triggering dynamic lookup via the descriptor protocol,
__getattr__()
or__getattribute__()
.
Use isinstance(..., staticmethod)
on the result:
>>> from inspect import getattr_static
>>> isinstance(getattr_static(A, 'g'), staticmethod)
True
The function can handle both instances and classes, and will scan the full class hierarchy for you:
>>> class B(A): pass
...
>>> isinstance(getattr_static(B, 'g'), staticmethod) # inherited
True
>>> isinstance(getattr_static(B(), 'g'), staticmethod) # instance, inherited
True
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With