programacion poo otra orientada objetos metodos metodo llamar instancia importar herencia clases clase python

poo - ¿Cómo obtengo la lista de métodos en una clase de Python?



poo python 3 (9)

Existe el método dir(theobject) para listar todos los campos y métodos de su objeto (como una tupla) y el módulo de inspección (como código escrito) para listar los campos y métodos con su documento (en "" ").

Debido a que todo (incluso los campos) puede llamarse en Python, no estoy seguro de que haya una función incorporada para listar solo métodos. Es posible que desee probar si el objeto que obtiene a través de dir es callable o no.


Probar la propiedad __dict__ .


Python 3.x responde sin bibliotecas externas

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func))]

resultado excluido

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func)) and not func.startswith("__")]


Sé que esta es una publicación antigua, pero solo escribí esta función y la dejaré aquí en caso de que alguien tropiece buscando una respuesta:

def classMethods(the_class,class_only=False,instance_only=False,exclude_internal=True): def acceptMethod(tup): #internal function that analyzes the tuples returned by getmembers tup[1] is the #actual member object is_method = inspect.ismethod(tup[1]) if is_method: bound_to = tup[1].im_self internal = tup[1].im_func.func_name[:2] == ''__'' and tup[1].im_func.func_name[-2:] == ''__'' if internal and exclude_internal: include = False else: include = (bound_to == the_class and not instance_only) or (bound_to == None and not class_only) else: include = False return include #uses filter to return results according to internal function and arguments return filter(acceptMethod,inspect.getmembers(the_class))


Si su método es un método "regular" y no un método statimethod , un método de statimethod , etc.
Hay un pequeño truco que se me ocurrió -

for k, v in your_class.__dict__.items(): if "function" in str(v): print(k)

Esto se puede extender a otro tipo de métodos cambiando "función" en la condición if correspondiente.
Probado en python 2.7.


Tenga en cuenta que debe considerar si desea que los métodos de las clases base que se heredan (pero no se invaliden) se incluyan en el resultado. Las operaciones dir() e inspect.getmembers() incluyen métodos de clase base, pero el uso del atributo __dict__ no lo hace.


Un ejemplo (enumerando los métodos de la clase optparse.OptionParser ):

>>> from optparse import OptionParser >>> import inspect >>> inspect.getmembers(OptionParser, predicate=inspect.ismethod) [([(''__init__'', <unbound method OptionParser.__init__>), ... (''add_option'', <unbound method OptionParser.add_option>), (''add_option_group'', <unbound method OptionParser.add_option_group>), (''add_options'', <unbound method OptionParser.add_options>), (''check_values'', <unbound method OptionParser.check_values>), (''destroy'', <unbound method OptionParser.destroy>), (''disable_interspersed_args'', <unbound method OptionParser.disable_interspersed_args>), (''enable_interspersed_args'', <unbound method OptionParser.enable_interspersed_args>), (''error'', <unbound method OptionParser.error>), (''exit'', <unbound method OptionParser.exit>), (''expand_prog_name'', <unbound method OptionParser.expand_prog_name>), ... ]

Tenga en cuenta que getmembers devuelve una lista de 2-tuplas. El primer elemento es el nombre del miembro, el segundo elemento es el valor.

También puede pasar una instancia a getmembers :

>>> parser = OptionParser() >>> inspect.getmembers(parser, predicate=inspect.ismethod) ...


también puede importar el tipo de función de los tipos y probarlo con la class.__dict__ :

from types import FunctionType class Foo: def bar(self): pass def baz(self): pass def methods(cls): return [x for x, y in cls.__dict__.items() if type(y) == FunctionType] methods(Foo) # [''bar'', ''baz'']


def find_defining_class(obj, meth_name): for ty in type(obj).mro(): if meth_name in ty.__dict__: return ty

Asi que

print find_defining_class(car, ''speedometer'')

Think Python página 210