IC # lo hacemos a través de la reflexión. En Javascript es simple como:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
¿Cómo hacerlo en Python?
python
reflection
properties
Jader Dias
fuente
fuente
@property
.Respuestas:
Tenga en cuenta que en algunos casos raros hay una
__slots__
propiedad, tales clases a menudo no tienen__dict__
.fuente
__setattr__()
. Establecer valores directamente en el diccionario omite el definidor del objeto (y / o el de sus padres). Es bastante común en Python que sucedan más cosas de lo que parece a simple vista durante el establecimiento de atributos (por ejemplo, saneamiento), el usosetattr()
asegura que no se lo pierda o se ve obligado a manejarlas explícitamente usted mismo.vars()
solo devuelve miembros estáticos (es decir, atributos de objeto y métodos registrados con ese objeto__dict__
). No no regreso miembros dinámicos (es decir, atributos de los objetos y métodos dinámicamente definidos por de ese objeto__getattr__()
método o magia similar). Con toda probabilidad, sufile.ImplementationName
propiedad deseada se define dinámicamente y, por lo tanto, no está disponible paravars()
odir()
.Ver
inspect.getmembers(object[, predicate])
.fuente
attributes
lugar demembers
(¿hay alguna diferencia entre los dos?). Podrían haber arreglado el nombre en Python 3.0 para que sea coherente.__dict__
, lo siento.inspect.getmembers()
terminadir()
con los beneficios secundarios (en su mayoría insignificantes) de (A) que incluyen atributos de clase dinámica y atributos de metaclase y (B) excluye miembros que no coinciden con el predicado pasado. Bostezo, ¿verdad?inspect.getmembers()
es apropiado para bibliotecas de terceros que admiten genéricamente todos los tipos de objetos posibles. Para casos de uso estándar, sin embargo, esdir()
absolutamente suficiente.dir()
Es la manera simple. Mira aquí:Guía para la introspección de Python
fuente
dir()
gracias.La
__dict__
propiedad del objeto es un diccionario de todas sus otras propiedades definidas. Tenga en cuenta que las clases de Python pueden anular getattr y hacer cosas que parecen propiedades pero que no están en__dict__
. También están las funciones integradasvars()
ydir()
que son diferentes en formas sutiles. Y__slots__
puede reemplazar__dict__
en algunas clases inusuales.Los objetos son complicados en Python.
__dict__
es el lugar correcto para comenzar con la programación al estilo de reflexión.dir()
es el lugar para comenzar si estás pirateando en un shell interactivo.fuente
print vars.__doc__
indica queWith an argument, equivalent to object.__dict__
¿Cuáles serían las diferencias sutiles?georg scholly versión más corta
fuente
Si está buscando un reflejo de todas las propiedades, las respuestas anteriores son excelentes.
Si simplemente está buscando obtener las claves de un diccionario (que es diferente de un 'objeto' en Python), use
my_dict.keys()
fuente
obj['key']
vs.obj.property
) y la pregunta era sobre las propiedades de los objetos. Puse mi respuesta aquí porque hay una fácil confusión entre los dos.Esto está totalmente cubierto por las otras respuestas, pero lo haré explícito. Un objeto puede tener atributos de clase y atributos de instancia estáticos y dinámicos.
stasis
es estático,dyno
es dinámico (ver decorador de propiedades) yclassy
es un atributo de clase. Si simplemente lo hacemos__dict__
ovars
solo obtendremos el estático.Entonces, si queremos, los demás
__dict__
obtendrán todo (y más). Esto incluye métodos y atributos mágicos y métodos vinculados normales. Así que evitemos esos:El
type
llamado con un método decorado de propiedad (un atributo dinámico) le dará el tipo del valor devuelto, nomethod
. Para probar esto, json lo secuenciamos:Si hubiera sido un método, se habría estrellado.
TL; DR. intenta llamar
extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
a los tres, pero no métodos ni magia.fuente