Non si stanno utilizzando gli argomenti posizionali nell'esempio. Quindi il codice di riferimento è:
class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
Nella prima riga si definisce classe attrdict
come una sottoclasse di dict
. Nella seconda riga si definisce la funzione che inizializzerà automaticamente l'istanza. Passi gli argomenti delle parole chiave (**kargs
) a questa funzione. Quando si crea un'istanza a
:
a = attrdict(x=1, y=2)
in realtà si sta chiamando
attrdict.__init__(a, {'x':1, 'y':2})
dict esempio di inizializzazione di base è fatto da inizializzare l'dict
superclasse incorporato. Questo viene fatto nella terza riga passando i parametri ricevuti in attrdict.__init__
. Così,
dict.__init__(self,{'x':1, 'y':2})
rende self
(l'istanza a
) un dizionario:
self == {'x':1, 'y':2}
La cosa bella si verifica nell'ultima riga: Ogni istanza ha un dizionario che tiene i suoi attributi. Questo è self.__dict__
(ad es.a.__dict__
).
Ad esempio, se
a.__dict__ = {'x':1, 'y':2}
possiamo scrivere a.x
o a.y
e ottenere i valori 1 o 2, rispettivamente.
Quindi, questo è quello che fa la linea 4:
self.__dict__ = self
è equivalente a:
a.__dict__ = a where a = {'x':1, 'y':2}
Poi posso chiamare a.x
e a.y
.
La speranza non è troppo caotica.
questo è un buon modo per perdere memoria. Vedi http://bugs.python.org/issue1469629 per una spiegazione e un'alternativa migliore. –