Vous n'utilisez pas d'arguments positionnels dans votre exemple. Ainsi, le code correspondant est:
class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
Dans la première ligne, vous définissez la classe attrdict
comme une sous-classe de dict
. Dans la deuxième ligne, vous définissez la fonction qui initialisera automatiquement votre instance. Vous transmettez les arguments du mot clé (**kargs
) à cette fonction. Lorsque vous instanciez a
:
a = attrdict(x=1, y=2)
vous appelez en fait
attrdict.__init__(a, {'x':1, 'y':2})
dict exemple l'initialisation de base se fait en initialisant le dict
builtin superclasse. Ceci est fait dans la troisième ligne en passant les paramètres reçus en attrdict.__init__
. Ainsi,
dict.__init__(self,{'x':1, 'y':2})
fait self
(l'instance a
) un dictionnaire:
self == {'x':1, 'y':2}
La bonne chose se produit dans la dernière ligne: Chaque instance a un dictionnaire tenant ses attributs. Ceci est self.__dict__
(c.-à-d.a.__dict__
).
Par exemple, si
a.__dict__ = {'x':1, 'y':2}
nous pourrions écrire a.x
ou a.y
et obtenir des valeurs 1 ou 2, respectivement.
Alors, voici ce ligne 4 fait:
self.__dict__ = self
équivaut à:
a.__dict__ = a where a = {'x':1, 'y':2}
Ensuite, je peux appeler a.x
et a.y
.
L'espoir n'est pas trop salissant.
Ceci est un bon moyen de fuir la mémoire. Voir http://bugs.python.org/issue1469629 pour une explication, et une meilleure alternative. –