2010-07-30 6 views
10

Mi piacerebbe sapere il motivo per cui si è in grado di creare un nuovo attributo ("nuovo" significa "non precedentemente definita nel corpo di classe") per un'istanza di un tipo personalizzato, ma non è in grado di fare lo stesso per un tipo built-in, come object stesso.Perché i tipi personalizzati accettano attributi ad-hoc in Python (e i built-in non lo fanno)?

Un esempio di codice:

>>> 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' 

risposta

6

Alcuni oggetti non hanno l'attributo __dict__ (che è un dizionario che memorizza tutte le custom 'appena definito' attributi). È possibile emulare lo stesso comportamento utilizzando la variabile __slots__ (vedere python reference). Quando si sottoclassa una classe con __dict__, la variabile __slots__ non ha alcun effetto. E come si è sempre sottoclasse oggetto per le nuove classi di stile, l'oggettonon deve avere __dict__, come che renderebbe impossibile l'uso __slots__. Le classi senza __slots__ occupano meno memoria e sono probabilmente leggermente più veloci.

Problemi correlati