2012-02-29 9 views
6

Se la mia comprensione del modello di dati Python è corretta, entrambe le istanze di classi e classi hanno associato gli oggetti __dict__ che contengono tutti gli attributi. Tuttavia, sono un po 'confuso sul motivo per cui alcune istanze di classe, come ad esempio le istanze di str, non hanno un attributo __dict__.Python: perché l'attributo __dict__ non è presente nelle istanze di classe integrate

Se creo una classe personalizzata:

class Foo: 
    def __init__(self): 
      self.firstname = "John" 
      self.lastname = "Smith" 

Poi posso ottenere le variabili di istanza dicendo:

>>> f = Foo() 
>>> print(f.__dict__) 
{'lastname': 'Smith', 'firstname': 'John'} 

Ma se provo a fare lo stesso con un'istanza del incorporato in str, ottengo:

>>> s = "abc" 
>>> print(s.__dict__) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute '__dict__' 

Quindi, perché non le istanze di str hanno un 0 Attributo?

+2

di elaborare su questo, se ogni dict aveva un '__dict__', allora non ci sarebbe deve essere anche '__dict __.__ dict__' - quanto dovrebbe essere profonda la ricorsione? –

risposta

10

Le istanze di tipi definiti in C non hanno un attributo __dict__ per impostazione predefinita.

0

Giusto per aggiungere a questo:

È possibile ottenere l'equivalente di una sola lettura __dict__ utilizza questo:

{s:getattr(x,s) for x in dir(x)} 
Problemi correlati