2011-01-18 4 views
15

Si deseo acceder a la lista de variables de instancia de un objeto, puedo llamar al myObject.__dict__.keys(). Quiero usar este atributo para imprimir todas las variables de instancia de un objeto. Dudo en hacer esto porque __dict__ es un atributo "secreto", y no entiendo lo que significa this footnote.Accediendo a las variables de instancia de Python con __dict __- ¿Está mal?

¿Es incorrecto usar myObject.__dict__?

+4

Puede que (?) Prefiera 'vars (myObject)' estilísticamente, pero eso es ortogonal a su pregunta. Da el mismo __dict__. –

Respuesta

6

Lo que significa la nota al pie es que no debe tratar de acceder al __dict__ directamente, sino que verifica si la función/el comportamiento que desea está disponible.

Así que en vez de hacer algo como:

if "__some_attribute__" in obj.__dict__: 
    # do stuff 

en su lugar debe hacer:

try: 
    obj.some_action_i_want_to_do(...) 
except AttributeError: 
    # doesn't provide the functionality I want 

Las razones para esto son porque los diferentes objetos podrían proporcionar diferentes referencias internas a una determinada acción, pero aún así proporcionan la salida deseada

Si desea enumerar las "partes internas" para depurar e inspeccionar el objeto actual, entonces dir() es la forma correcta de hacerlo.

+0

Pero 'dir()' solo da los nombres; '__dict__' también da los objetos ellos mismos. –

4

Puede usar la función dir para listar todos los atributos de un objeto.

-2

De acuerdo con esa nota al pie, __dict__ solo existe en los objetos del módulo.

Lo que está buscando es probablemente la función integrada dir(). Por ejemplo:

>>> f = open('foo', 'w') 
>>> dir(f) 
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines'] 
+0

'__dict__' * does * existe para cosas aparte de los módulos. Aunque no existe para todos los objetos (incorporados, cosas con '__slots__', ¿quizás instancias de clase antiguas?). – delnan

3

Su uso para cosas como la impresión de miembros para la depuración debería estar bien. Pero si eso es todo lo que estás haciendo, mira bonito.

http://docs.python.org/library/pprint.html

El principal problema con __dict__, es que viola las reglas de visibilidad implícitas de objetos que Python tiene.

+0

'__dict__' es hackeo. Es poderoso y peligroso, y no * necesitas * nada para la programación. Es por eso. Que viola la visibilidad es solo una parte de eso. – delnan

+0

Gracias por señalar pprint. Siempre me pregunté si había una manera fácil de emular la impresión de colecciones de estilo iPython. – sans

+0

Este '__dict__' problema parece un poco como un agujero de conejo, pero me gustaría entenderlo mejor. ¿Qué quieres decir con reglas de visibilidad implícita? – sans

5

Esa nota al pie está en referencia al atributo __dict__ de un módulo . El atributo __dict__ de un objeto no lleva dicha advertencia (documentation).

+0

Hay advertencias similares para objetos cuando se utilizan accesos, metaclases o ranuras. Las excepciones son tan baratas en Python que se usan para finalizar la iteración en generadores. – Apalala

Cuestiones relacionadas