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.
Quiero recorrer los métodos en una clase, o manejar los objetos de clase o instancia de manera diferente en función de los métodos presentes. ¿Cómo obtengo una lista de métodos de clase?
Ver también:
- ¿Cómo puedo listar los métodos en un módulo de Python 2.5?
- Bucle sobre los métodos de objetos Python / IronPython
- Encontrar los métodos que tiene un objeto.
- ¿Cómo miro dentro de un objeto de Python?
- ¿Cómo realizo la introspección en un objeto en Python 2.x?
- ¿Cómo obtener una lista completa de los métodos y atributos del objeto?
- ¿Averiguar qué funciones están disponibles desde una instancia de clase en python?
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