Quiero iterar a través de los métodos en una clase, o manejar 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 enumerar los métodos en un módulo Python 2.5?
- Bucle sobre un método de objeto Python / IronPython
- Encontrar los métodos que tiene un objeto
- ¿Cómo miro dentro de un objeto 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?
- ¿Descubrir qué funciones están disponibles desde una instancia de clase en python?
binding
funciona: stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
o solodir(ClassName)
para todoRespuestas:
Un ejemplo (enumerando los métodos de la
optparse.OptionParser
clase):Observe 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
:fuente
inspect.isroutine
podría ser un predicado más apropiado;inspect.ismethod
no funciona para todos los métodos de los objetos.Existe el
dir(theobject)
método para enumerar todos los campos y métodos de su objeto (como una tupla) y el módulo de inspección (como escritura de codeape) para enumerar los campos y métodos con su documento (en "" ").Debido a que todo (incluso los campos) podrían llamarse en Python, no estoy seguro de que haya una función incorporada para enumerar solo los métodos. Es posible que desee probar si el objeto que atraviesa
dir
es invocable o no.fuente
Python 3.x responde sin bibliotecas externas
resultado excluido de dunder:
fuente
Supongamos que desea conocer todos los métodos asociados con la clase de lista Solo escriba lo siguiente
Lo anterior le dará todos los métodos de la clase de lista
fuente
print([ m for m in dir(my_class) if not m.startswith('__')])
Prueba la propiedad
__dict__
.fuente
__dict__
. Sin embargo, las clases también tienen__dict__
y eso debería mostrar los métodos de clase :)También puede importar el FunctionType de los tipos y probarlo con
class.__dict__
:fuente
and not x.startswith('_')
al final de la lista la comprensión de mi uso para ignorar__init__
los métodos privados y.import
deFunctionType
mediante el uso de un lambda de usar y tirar contype()
:type(lambda:0)
isinstance
Sería mejor quetype(y) == FunctionType
aquí.Tenga en cuenta que debe considerar si desea que los métodos de las clases base que se heredan (pero no se reemplacen) se incluyan en el resultado. Las operaciones
dir()
yinspect.getmembers()
incluyen métodos de clase base, pero el uso del__dict__
atributo no.fuente
Esto también funciona:
mymodule.py
En otro archivo
salida:
De los documentos de Python:
inspect.isroutine (objeto)
fuente
Entonces
Think Python página 210
fuente
Hay este enfoque:
Cuando se trata de una instancia de clase , quizás sería mejor devolver una lista con las referencias de métodos en lugar de solo nombres¹. Si ese es tu objetivo, así como
import
__init__
. Ej. ) De la listaPuede ser de utilidad. En pocas palabras, para una clase como
Podríamos verificar la recuperación de la instancia con
Entonces puede llamarlo de inmediato:
¹ Un caso de uso:
Usé esto para pruebas unitarias . Tenía una clase en la que todos los métodos realizaban variaciones del mismo proceso, lo que conducía a largas pruebas, cada una a solo un toque de distancia de las demás. DRY era un sueño lejano.
Pensé que debería tener una sola prueba para todos los métodos, así que hice la iteración anterior.
Aunque me di cuenta de que en su lugar debería refactorizar el código en sí mismo para que sea compatible con DRY de todos modos ... esto aún puede servir a un alma puntiaguda al azar en el futuro.
fuente
Simplemente mantengo esto allí, porque las respuestas mejor calificadas no son claras .
Esta es una prueba simple con una clase no habitual basada en Enum.
Y esto es resultados de salida.
Entonces lo que tenemos:
dir
proporcionar datos no completosinspect.getmembers
proporcionar datos no completos y proporcionar claves internas a las que no se puede acceder congetattr()
__dict__.keys()
proporcionar resultados completos y confiables¿Por qué los votos son tan erróneos? ¿Y dónde me equivoco? ¿Y dónde equivocado otras personas cuyas respuestas tienen votos tan bajos?
fuente
da una lista idéntica a
hace.
fuente
Puede enumerar todos los métodos en una clase de Python utilizando el siguiente código
Esto devolverá una lista de todos los nombres de los métodos en la clase
fuente
Si su método es un método "regular" y no un método
statimethod
,classmethod
etc.Se me ocurrió un pequeño truco:
Esto puede extenderse a otro tipo de métodos cambiando la "función" en la
if
condición correspondiente.Probado en python 2.7.
fuente
Sé que esta es una publicación antigua, pero acabo de escribir esta función y la dejaré aquí en caso de que alguien tropiece buscando una respuesta:
fuente
Esto es solo una observación. "codificar" parece ser un método para objetos de cadena
Sin embargo, si se inspecciona str1 en busca de métodos, se devuelve una lista vacía
Entonces, tal vez estoy equivocado, pero el problema parece no ser simple.
fuente
'a'
es un objeto, cuyo tipo esstr
. Puedes ver esto corriendotype('a')
.inspect.getmember()
toma un parámetro de tipo, por lo que debe llamarinspect.getmember(str)
para ver qué espera.salida
fuente
Si desea enumerar solo los métodos de una clase python
fuente