2010-04-14 3 views
11
class attrdict(dict): 
    def __init__(self, *args, **kwargs): 
     dict.__init__(self, *args, **kwargs) 
     self.__dict__ = self 

a = attrdict(x=1, y=2) 
print a.x, a.y 

b = attrdict() 
b.x, b.y = 1, 2 
print b.x, b.y 

Quelqu'un pourrait-il expliquer les quatre premières lignes en mots? J'ai lu des classes et des méthodes. Mais ici, il semble très confus.classe, dict, self, init, args?

+0

Ceci est un bon moyen de fuir la mémoire. Voir http://bugs.python.org/issue1469629 pour une explication, et une meilleure alternative. –

Répondre

5

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.

+0

mieux que celui accepté. – Musaffa

4

est ici un bon article qui explique __dict__:

The Dynamic dict

La classe attrdict exploite qu'en héritant d'un dictionnaire, puis la mise en __dict__ de l'objet à ce dictionnaire. Tout accès d'attribut se produit donc contre le dictionnaire parent (c'est-à-dire la classe dict dont il hérite).

Le reste de l'article est assez bon aussi pour les objets Python compréhension:

Python Attributes and Methods

7

Mon coup à une explication ligne par ligne:

class attrdict(dict): 

Cette ligne déclare une classe attrdict en tant que sous-classe de la classe dict intégrée.

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs) 

Ceci est votre méthode standard __init__. L'appel à dict.__init__(...) consiste à utiliser la méthode du constructeur super() de la classe 0 (dans ce cas, dict).

La dernière ligne, self.__dict__ = self le rend si les mots-clés arguments (kwargs) vous passez à la méthode __init__ est accessible comme attributs, à savoir, a.x, a.y dans le code ci-dessous.

J'espère que cela aidera à dissiper votre confusion.

+0

Besoin de réparer le '__init__'. Mettez-les en arrière, et ils ressembleront à mon '__init__'. –

+0

Cette aide tellement. Je vous remercie! – kame