¿Hay alguna manera de obtener una lista de atributos que existen en las instancias de una clase?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
El resultado deseado es que se generará "multi, str". Quiero que esto vea los atributos actuales de varias partes de un script.
python
class
python-3.x
MadSc13ntist
fuente
fuente
NewClass
. Puede desafiar las expectativas de las personas si usa una convención de nomenclatura comonew_class
.help()
función ayuda a obtener información sobre clases, funciones, módulos integrados y másRespuestas:
También puede encontrar útil pprint .
fuente
pprint.pprint(a.__dict__)
hace una bonita impresión en los atributos.pprint
NO funciona en Python 2.6.Luego puede probar qué tipo es con
type()
o si es un método concallable()
.fuente
boston
conjunto de datos de sklearn:__dict__
estaba vacía, cuando en realidad había 5 atributos disponiblesvars(obj)
devuelve los atributos de un objeto.fuente
Todas las respuestas anteriores son correctas, tiene tres opciones para lo que está preguntando.
dir()
vars()
__dict__
fuente
vars(foo)
regresafoo.__dict__
Esto, por supuesto, imprimirá cualquier método o atributo en la definición de clase. Puede excluir métodos "privados" cambiando
i.startwith('__')
ai.startwith('_')
fuente
El módulo de inspección proporciona formas fáciles de inspeccionar un objeto:
Utilizando
getmembers()
puedes ver todos los atributos de tu clase, junto con su valor. Para excluir el uso de atributos privados o protegidos.startswith('_')
. Para excluir métodos o funciones, useinspect.ismethod()
oinspect.isfunction()
.Tenga en cuenta que
ismethod()
se utiliza en el segundo elemento dei
ya que el primero es simplemente una cadena (su nombre).Offtopic: Use CamelCase para los nombres de clase.
fuente
Puede usar
dir(your_object)
para obtener los atributos ygetattr(your_object, your_object_attr)
obtener los valoresuso:
Esto es particularmente útil si su objeto no tiene __dict__. Si ese no es el caso, puede probar var (your_object) también
fuente
A menudo se menciona que para enumerar una lista completa de atributos debe usar
dir()
. Sin embargo, tenga en cuenta que, contrariamente a la creencia populardir()
, no resalta todos los atributos. Por ejemplo, puede notar que__name__
puede faltar en ladir()
lista de una clase a pesar de que puede acceder desde la misma clase. Desde el documento en adelantedir()
( Python 2 , Python 3 ):Una función como la siguiente tiende a ser más completa, aunque no hay garantía de integridad ya que la lista devuelta
dir()
puede verse afectada por muchos factores, incluida la implementación del__dir__()
método, la personalización__getattr__()
o__getattribute__()
la clase o uno de sus padres. Vea los enlaces provistos para más detalles.fuente
¿Para qué quieres esto? Puede ser difícil obtener la mejor respuesta sin conocer su intención exacta.
Casi siempre es mejor hacerlo manualmente si desea mostrar una instancia de su clase de una manera específica. Esto incluirá exactamente lo que desea y no incluirá lo que no desea, y el orden será predecible.
Si está buscando una manera de mostrar el contenido de una clase, formatee manualmente los atributos que le interesan y proporcione esto como el método
__str__
o__repr__
para su clase.Si desea conocer qué métodos y tales existen para que un objeto entienda cómo funciona, utilícelo
help
.help(a)
le mostrará una salida formateada sobre la clase del objeto en función de sus cadenas de documentos.dir
existe para obtener programáticamente todos los atributos de un objeto. (El acceso__dict__
hace algo que yo agruparía igual pero que no usaría yo mismo). Sin embargo, esto puede no incluir las cosas que desea y puede incluir cosas que no desea. No es confiable y la gente piensa que lo quieren mucho más a menudo que ellos.En una nota algo ortogonal, hay muy poco soporte para Python 3 en este momento. Si está interesado en escribir software real, querrá cosas de terceros como numpy, lxml, Twisted, PIL o cualquier cantidad de marcos web que aún no sean compatibles con Python 3 y que no tengan planes para hacerlo demasiado pronto. Las diferencias entre 2.6 y la rama 3.x son pequeñas, pero la diferencia en el soporte de la biblioteca es enorme.
fuente
Hay más de una forma de hacerlo:
Cuando se ejecuta, este código produce:
fuente
Consulte el script de shell de Python que se ha ejecutado en secuencia, aquí obtendrá los atributos de una clase en formato de cadena separados por comas.
Estoy usando python 3.4
fuente
a.__dict__.keys()
. Sin embargo, si desea saber si un objeto tiene un atributo específico, puede usarlohasattr
.Además de estas respuestas, incluiré una función (python 3) para escupir prácticamente toda la estructura de cualquier valor. Se usa
dir
para establecer la lista completa de nombres de propiedades, luego se usagetattr
con cada nombre. Muestra el tipo de cada miembro del valor y, cuando es posible, también muestra el miembro completo:Ahora, cualquiera de los siguientes debe dar una idea:
fuente
Obtener atributos de un objeto
Salida
fuente
Como se escribió antes de usar,
obj.__dict__
puede manejar casos comunes, pero algunas clases no tienen el__dict__
atributo y usan__slots__
(principalmente para la eficiencia de la memoria).ejemplo para una forma más resistente de hacer esto:
salida de este código:
Nota 1:
Python es un lenguaje dinámico y siempre es mejor conocer las clases de las que intenta obtener los atributos, ya que incluso este código puede pasar por alto algunos casos.
Nota 2:
este código solo genera variables de instancia, lo que significa que no se proporcionan variables de clase. por ejemplo:
salidas de código:
Este código no imprime el
url
atributo de clase y puede omitir los atributos de clase deseados.A veces podríamos pensar que un atributo es un miembro de instancia, pero no lo es y no se mostrará con este ejemplo.
fuente
__dict__
y__slots__
, por lo tanto, es probable que desee probar ambos en lugar de solo el dict.__dict__
ovars
no funciona porque se pierde__slots__
.__dict__
y__slots__
no funciona porque se pierde__slots__
de las clases base.dir
no funciona porque incluye atributos de clase, como métodos o propiedades, así como los atributos del objeto.vars
es equivalente a usar__dict__
.Esto es lo mejor que tengo:
fuente
fuente
Consulte la siguiente ejecución de secuencia de comandos de shell Python en secuencia, dará la solución desde la creación de la clase hasta la extracción de los nombres de campo de las instancias.
fuente
__attr__
da la lista de atributos de una instancia.fuente
__attr__
en la descripción pero la usas__attrs__
en el código. Ninguno de los dos funcionó para mí (werkzeug.datastructures.FileStorage)