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?
@property
.
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?
@property
.
Respuestas:
for property, value in vars(theObject).iteritems():
print property, ": ", value
Tenga en cuenta que en algunos casos raros hay una __slots__
propiedad, tales clases a menudo no tienen __dict__
.
__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 uso setattr()
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, su file.ImplementationName
propiedad deseada se define dinámicamente y, por lo tanto, no está disponible para vars()
o dir()
.
Ver inspect.getmembers(object[, predicate])
.
Devuelve todos los miembros de un objeto en una lista de pares (nombre, valor) ordenados por nombre. Si se proporciona el argumento de predicado opcional, solo se incluyen los miembros para los cuales el predicado devuelve un valor verdadero.
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
lugar de members
(¿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()
termina dir()
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, es dir()
absolutamente suficiente.
dir()
Es la manera simple. Mira aquí:
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 integradas vars()
y dir()
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.
print vars.__doc__
indica que With an argument, equivalent to object.__dict__
¿Cuáles serían las diferencias sutiles?
georg scholly versión más corta
print vars(theObject)
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()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
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.
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
es estático, dyno
es dinámico (ver decorador de propiedades) y classy
es un atributo de clase. Si simplemente lo hacemos __dict__
o vars
solo obtendremos el estático.
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
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:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
El type
llamado con un método decorado de propiedad (un atributo dinámico) le dará el tipo del valor devuelto, no method
. Para probar esto, json lo secuenciamos:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
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.