2009-04-20 10 views
2

__init__ 메서드를 덮어 쓰려고하는데 super 메서드를 호출 할 때 해당 메서드에서 만든 특성을 사용할 수 없습니다. class B에는 여전히 사용 가능한 특성이 있기 때문에 상속 문제가 아닌 것을 알 수 있습니다.__init__를 덮어 쓸 때 속성을 사용할 수 없습니까?

나는 코드 샘플이 더 나은 :-)를 설명 할 것입니다 생각

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

답변

5
슈퍼 클래스에 대한 귀하의 전화가 자신의 유형을 사용할 필요가

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

보다는

super(A... 

super(A, self).__init__을 호출하면 A이라는 수퍼 클래스가 호출됩니다. 이는 012입니다.. 오히려 D의 수퍼 클래스 (A)를 호출하려고합니다.

3

super()를 잘못 사용하고 있습니다. 당신의 "C"클래스에서 초기화() 메서드의 두 번째 줄은 ...과 같이 첫 번째 인수로

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

을 C를 통과해야 그리고 정말 당신도 슈퍼 여기에 사용할 필요가 없습니다. 전화하실 수 있습니다

A.__init__(self, *args, **kwargs) 
관련 문제