2009-04-20 6 views
2

J'essaye d'écraser une méthode __init__, mais quand j'appelle la super méthode les attributs créés dans cette méthode ne sont pas disponibles. Je peux voir que ce n'est pas un problème d'héritage puisque class B a toujours les attributs disponibles.Attributs non disponibles lors de l'écrasement __init__?

Je pense que l'exemple de code vous expliquera mieux :-)

Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49) 
[GCC 4.3.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> class A(object): 
... def __init__(self, *args, **kwargs): 
...  self.args = args 
...  self.kwargs = kwargs 
... 
>>> a = A('a', 'b', key='value') 
>>> print a.args, a.kwargs 
('a', 'b') {'key': 'value'} 
>>> class B(A): 
... pass 
... 
>>> b = B('b', 'c', key_b='value_b') 
>>> print b.args, b.kwargs 
('b', 'c') {'key_b': 'value_b'} 
>>> class C(A): 
... def __init__(self, *args, **kwargs): 
...  print 'class C' 
...  super(A, self).__init__(*args, **kwargs) 
... 
>>> c = C('c', 'd', key_c='value_C') 
class C 
>>> print c.args, c.kwargs 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'C' object has no attribute 'args' 
>>> class D(A): 
... def __init__(self, *args, **kwargs): 
...  super(A, self).__init__(*args, **kwargs) 
...  print 'D' 
... 
>>> d = D('d', 'e', key_d='value D') 
D 
>>> print d.args, d.kwargs 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'D' object has no attribute 'args' 
>>> 

Répondre

5

Votre appel à la superclasse doit utiliser son propre type

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

plutôt que

super(A... 

Je crois que l'appel super(A, self).__init__ appellera la superclasse de A, qui est object. Au contraire, vous voulez appeler la superclasse de D, qui est A.

3

Vous utilisez super() incorrectement. Dans votre « C » classe la deuxième ligne de la méthode initialisation() devrait passer C comme premier argument comme si ...

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

Et vraiment, vous devriez même pas besoin d'utiliser super ici. Vous pouvez simplement appeler

A.__init__(self, *args, **kwargs) 
Questions connexes