Атрибуты недоступны при перезаписи __init__? - PullRequest
2 голосов
/ 20 апреля 2009

Я пытаюсь переписать метод __init__, но когда я вызываю метод super, атрибуты, созданные в этом методе, недоступны. Я вижу, что это не проблема наследования, поскольку class B все еще имеет доступные атрибуты.

Я думаю, что пример кода объяснит это лучше: -)

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'
>>> 

Ответы [ 2 ]

5 голосов
/ 20 апреля 2009

Ваш вызов суперклассу должен использовать свой собственный тип

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

вместо

super(A...

Я считаю, что вызов super(A, self).__init__ вызовет суперкласс A, то есть object. Скорее, вы хотите вызвать суперкласс D, то есть A.

3 голосов
/ 20 апреля 2009

Вы используете super () неправильно. В вашем классе "C" вторая строка метода init () должна передавать C в качестве первого аргумента, например так ...

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

И действительно, вам даже не нужно использовать супер здесь. Вы можете просто позвонить

A.__init__(self, *args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...