2011-05-06 21 views
35

Es una cosa que me molestó por un tiempo. ¿Por qué no puedo hacer:Agregando atributos a los objetos de pitón

>>> a = "" 
>>> a.foo = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute 'foo' 

... mientras puedo hacer lo siguiente?

>>> class Bar(): 
...  pass 
... 
>>> a = Bar() 
>>> a.foo = 10 #ok! 

¿Cuál es la regla aquí? ¿Podría indicarme alguna descripción?

+1

Por cierto, debería utilizar 'clase Bar (objeto):' en lugar de 'clase Bar():' para que pueda obtener una clase de nuevo estilo – ThiefMaster

Respuesta

53

Puede agregar atributos a cualquier objeto que tenga un __dict__.

  • x = object() no lo tiene, por ejemplo.
  • Las cadenas y otros objetos integrados simples tampoco lo tienen.
  • Las clases que usan __slots__ tampoco las tienen.
  • Las clases definidas con class lo tienen a menos que se aplique la declaración anterior.

Si un objeto está utilizando __slots__/no tiene un __dict__, por lo general es para ahorrar espacio. Por ejemplo, en un str sería excesivo tener un dict - imagine la cantidad de hinchazón para una cadena muy corta.

Si quiere probar si un objeto dado tiene un __dict__, puede usar hasattr(obj, '__dict__').

This también podría ser interesante para leer:

Algunos objetos, como una función de los tipos y sus instancias (listas, tuplas, etc.) no tienen un __dict__. En consecuencia, los atributos definidos por el usuario no se pueden establecer en ellos.

Otro artículo interesante sobre el modelo de datos, incluyendo Python __dict__, __slots__, etc es this de la referencia pitón.

Cuestiones relacionadas