No está utilizando argumentos posicionales en su ejemplo. Por lo que el código en cuestión es:
class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
En la primera línea que define la clase attrdict
como una subclase de dict
. En la segunda línea, define la función que iniciará automáticamente su instancia. Pasa los argumentos de palabra clave (**kargs
) a esta función. Al crear una instancia a
:
a = attrdict(x=1, y=2)
en realidad se está llamando
attrdict.__init__(a, {'x':1, 'y':2})
dict instancia central de inicialización se realiza mediante la inicialización de la superclase dict
incorporado. Esto se hace en la tercera línea pasando los parámetros recibidos en attrdict.__init__
. Por lo tanto,
dict.__init__(self,{'x':1, 'y':2})
hace self
(la instancia a
) un diccionario:
self == {'x':1, 'y':2}
Lo bueno que ocurre en la última línea: Cada instancia tiene un diccionario de la celebración de sus atributos. Esto es self.__dict__
(es decira.__dict__
).
Por ejemplo, si
a.__dict__ = {'x':1, 'y':2}
podríamos escribir a.x
o a.y
y obtener valores de 1 ó 2, respectivamente.
Por lo tanto, esto es lo que hace la línea 4:
self.__dict__ = self
es equivalente a:
a.__dict__ = a where a = {'x':1, 'y':2}
Entonces puedo llamar a.x
y a.y
.
Espero que no sea demasiado complicado.
esta es una buena manera de perder memoria. Consulte http://bugs.python.org/issue1469629 para obtener una explicación y una mejor alternativa. –