2010-07-30 8 views
10

Me gustaría saber por qué uno puede crear un nuevo atributo ("nuevo" significa "no definido previamente en el cuerpo de la clase") para una instancia de un tipo personalizado, pero no puede hacer lo mismo para un tipo incorporado, como object sí mismo.¿Por qué los tipos personalizados aceptan atributos ad-hoc en Python (y los built-ins no)?

Un ejemplo de código:

>>> class SomeClass(object): 
...  pass 
... 
>>> sc = SomeClass() 
>>> sc.name = "AAA" 
>>> sc.name 
'AAA' 
>>> obj = object() 
>>> obj.name = "BBB" 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'name' 

Respuesta

6

Algunos objetos no tienen el atributo __dict__ (que es un diccionario que almacena toda la costumbre 'que acaba de definir' atributos). Puede emular el mismo comportamiento utilizando la variable __slots__ (consulte python reference). Cuando se subclasifica una clase con __dict__, la variable __slots__ no tiene ningún efecto. Y como siempre se está subclasificando el objeto para las nuevas clases de estilo, el objeto no debe tener __dict__, ya que eso imposibilitaría el uso de __slots__. Las clases sin __slots__ toman menos memoria y son probablemente un poco más rápidas.

Cuestiones relacionadas