son - ¿Cómo distinguir un método de instancia, un método de clase, un método estático o una función en Python 3?
metodos de clase python (2)
Solo necesita obtener el tipo de método, pero como los métodos son descriptores, debe:
1 - Saca la clase de la instancia. 2 - Busque la referencia del método en __dict__
en lugar de hacer una búsqueda de atributos.
P.EJ :
>>> f = Foo()
>>> type(f.__class__.__dict__[''bari''])
<class ''function''>
>>> type(f.__class__.__dict__[''barc''])
<class ''classmethod''>
>>> type(f.__class__.__dict__[''bars''])
<class ''staticmethod''>
Quiero distinguir entre métodos y funciones en Python 3. Además, quiero obtener la clase correspondiente si es un método. Mi solución actual es así:
import types
import inspect
def function_or_method(f):
if inspect.ismethod(f):
if inspect.isclass(f.__self__):
print("class method")
klass = f.__self__
else:
print("instance method")
klass = f.__self__.__class__
elif inspect.isfunction(f): # function
if f.__name__ != f.__qualname__: # to distiguish staticmethod and function
print("static method")
# HOW TO GET THE CLASS
else:
print("function")
else:
print("not function or method")
class Foo():
def bari(self):
pass
@classmethod
def barc(cls):
pass
@staticmethod
def bars():
pass
def barf():
pass
function_or_method(Foo().bari) # instance method
function_or_method(Foo.barc) # class method
function_or_method(Foo.bars) # static method
function_or_method(barf) # function
Funciona, pero parece no elegante. Y no estoy seguro de si me he perdido algo. ¿Alguien sabe una mejor solución?
ACTUALIZACIÓN 1 : también quiero obtener la clase correspondiente si es un método. Sé cómo manejar el método de clase / instancia (vea el código anterior), pero ¿cómo puedo obtener la clase para el método estático?
Creo que es mejor usar el método isfunction()
para inspect
.
Sintaxis:
[inspect.getmembers(<module name>, inspect.isfunction)] # will give all the functions in that module
Si desea probar un solo método, puede hacerlo por ...
inspect.isfunction(<function name>) # return true if is a function else false
Hay muchos predicados que puede usar junto con su función. Consulte la documentación de Python 3 para inspect
para obtener una imagen clara.