2009-08-09 23 views
89

I C# lo hacemos a través de la reflexión. En Javascript es simple como:¿Cómo se enumeran las propiedades de un objeto en Python?

for(var propertyName in objectName) 
    var currentPropertyValue = objectName[propertyName]; 

cómo hacerlo en Python?

+1

vincular esto: [? ¿Cómo se obtiene la lista de métodos en una clase Python] (http: //stackoverflow.com/questions/1911281/how-do-you-get-list-of-methods-in-a-python-class) –

Respuesta

102
for property, value in vars(theObject).iteritems(): 
    print property, ": ", value 

Tenga en cuenta que en algunos casos raros hay una propiedad __slots__, tales clases a menudo no tienen __dict__.

+1

ahora cómo cambiar el valor? en Javascript podría hacer: object [property] = newValue. ¿Cómo hacerlo en Python? –

+0

Lo tengo: objectName .__ dict __ [propertyName] = newValue –

+34

use setattr() en su lugar. – Nelson

35

dir() es la manera más simple. Ver aquí:

Guide To Python Introspection

+0

Algo a tener en cuenta en los documentos Python, _because dir() se proporciona principalmente como una conveniencia para su uso en un mensaje interactivo, intenta proporcionar un conjunto interesante de nombres más de lo que intenta proporcionar un conjunto de nombres riguroso o consistentemente definido, y su comportamiento detallado puede cambiar a lo largo de las versiones. Por ejemplo, los atributos de metaclass no están en la lista de resultados cuando el argumento es una clase._ – skyler

10

El __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 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 la programación de estilo de reflexión. dir() es el lugar para comenzar si está hackeando un caparazón interactivo.

+0

'print vars .__ doc__' indica que' Con un argumento, equivalente al objeto .__ dict__' Entonces, ¿cuáles serían las diferencias sutiles? –

57

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 predicado opcional, solo se incluyen los miembros para los que 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'] 
>>> 
+0

Sí, esta respuesta es genial; nunca usé este módulo antes getmembers() se implementa simplemente recorriendo los resultados de dir (object), btw. – Nelson

+0

¿Puede explicar por qué esto es mejor que acceder a __dict__? La documentación de Python no es útil, especialmente porque normalmente utiliza el término 'atributos' en lugar de' miembros' (¿hay alguna diferencia entre los dos?). Podrían haber corregido el nombre en Python 3.0 para que sea coherente. – nikow

+0

Oops, significa '__dict__', lo siento. – nikow

8

Georg Schölly más corta versión

print vars(theObject) 
4

Si usted está buscando para la reflexión de todas las propiedades, las respuestas anteriores son grandes.

Si usted está buscando simplemente para obtener las claves de un objeto, utilice

my_dict.keys()

my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' } 
my_dict.keys() 
> ['abc', 'def', 'ghi'] 
+0

debe aceptarse respuesta – danday74

+0

aunque es mi respuesta, no creo que deba ser la respuesta aceptada: las claves de un objeto son diferentes de la propiedad de una instancia de objeto de una clase. Se accede a ellos de manera diferente ('obj ['key']' vs. 'obj.property') y la pregunta era acerca de las propiedades del objeto. Puse mi respuesta aquí porque existe una confusión fácil entre los dos. – MrE

Cuestiones relacionadas