usar son resueltos poo objeto metodos metodo los instanciar imprimir ejercicios cuales como clases clase python python-3.x introspection

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.