2010-05-04 3 views
2

Ce n'est pas le résultat que j'attends à voir:classes Python Nouveau style et la Fonction Super

class A(dict): 
    def __init__(self, *args, **kwargs): 
     self['args'] = args 
     self['kwargs'] = kwargs 

class B(A): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(args, kwargs) 

print 'Instance A:', A('monkey', banana=True) 
#Instance A: {'args': ('monkey',), 'kwargs': {'banana': True}} 

print 'Instance B:', B('monkey', banana=True) 
#Instance B: {'args': (('monkey',), {'banana': True}), 'kwargs': {}} 

Je suis juste essayer d'obtenir des classes A et B d'avoir des valeurs cohérentes établies. Je ne sais pas pourquoi les kwargs sont insérés dans les arguments, mais je suppose que j'appelle soit __init__() mal de la sous-classe ou j'essaie de faire quelque chose que vous ne pouvez pas faire.

Des conseils?

Répondre

14

Essayez ceci:

super(B, self).__init__(*args, **kwargs) 

Puisque la fonction d'initialisation A attend args/kwargs réels (et pas seulement deux arguments), vous devez passer réellement les versions non emballés de args/kwargs de telle sorte que ils seront réemballés correctement. Sinon, la liste déjà remplie d'arguments et de dict de kwargs est ré-emballée comme une liste d'arguments avec deux éléments, et un dict kwargs vide, parce que vous passez une liste et une dict , au lieu des paramètres réels non nommés et nommés.

+0

omg wow. Je me sens vraiment stupide maintenant. était-ce * que * simple !!? Oui! ça a marché! Merci beaucoup! – jedmao

2

Alors que je suis entièrement d'accord avec Dav, savez-vous que si le __init__ de B n'a pas d'autre but que d'invoquer son super, vous pouvez l'omettre en toute sécurité? Ce que je veux dire est qu'avec vos exemples, vous pouvez simplement définir B comme

>>> class B(A): 
...  pass 
+1

oui. Je suis au courant de ça. Je vous remercie. Je cherchais à étendre la fonctionnalité __init__ cependant. – jedmao

Questions connexes