2013-10-29 4 views
0

나는이 있습니다파이썬 서브 클래스는 반드시 수퍼 클래스 생성자를 호출해야합니까?

#!/usr/bin/env python 
class myclass1(object): 
    def __init__(self, arg1):    
     self.var1 = arg1   

class myclass2(myclass1): 
    def f1(self): 
     print "in f1"    

class myclass3(myclass1): 
    def __init__(self, arg1):   
     self.var2 = arg1    
     self.c2 = myclass2() 

p= myclass3(5) 

이 나에게 오류를 제공합니다

Traceback (most recent call last): 
File "./pythoninherit.py", line 39, in <module> 
p= myclass3(5) 
File "./pythoninherit.py", line 29, in __init__ 
self.c2 = myclass2() 
TypeError: __init__() takes exactly 2 arguments (1 given) 

질문 : 왜 오류가 주어집니다?

왜이 경우 myclass1 __init__이 자동으로 호출 되었습니까?

저는 이것이 파이썬에서는 발생하지 않는다고 생각했습니다.

+4

은'__init__' 방법은 상속됩니다. 'class1'의'__init__' 메쏘드는 인자를 취하고 인자없이 인자를 호출합니다. –

+0

당신은 충분한 인수로'__init__'를 호출하지 않았기 때문에. 그래서 당신의 제목에 "예"라고 대답하십시오. 하위 클래스를 구성 할 때 부모 클래스에 전달 될 인수를 전달해야합니다. – Cfreak

+0

@IsmailBadawi 답변으로 추가하십시오. – abc

답변

2

myclass1__init__ 방법은 myclass2에 의해 계승됩니다. myclass2을 인스턴스화 할 때는 myclass1에서 __init__ 메서드를 호출하지만 인수가 필요하므로 전달하지 않습니다. 당신이 myclass3에 대한 매개 변수로 (5)를 준 것처럼

0

문제는 MyClass2의이 myclass1의 서브 클래스입니다 그리고 당신은

self.c2 = myclass2(arg1) 

는 그래서 MyClass2의이 myclass1의 __init__ 인 호출 될

self.c2 = myclass2() 

필요에 MyClass2의 할 ARG1을 통과하지 않습니다 하나의 인수가 필요합니다.

2

그들은 항상 그래야 할 필요는 없지만, 어떻게 바꾸는 지 알고 싶다면 __init__을 무시해야합니다. 초기화가 작동합니다. 기본 클래스가 초기화하는 데 인수가 필요하고 하위 클래스가 초기화되지 않은 경우 하위 클래스는 API를 변경하므로 자체적으로 __init__을 작성해야합니다.

당신의 예에서

myclass2이 myclass1에서 __init__ 상속 (이 호출 여부는 기본 클래스.이 기본 초기화 동작을 상속하고 싶어 여부에 따라 다름),하지만 당신은 그것을 당신이 myclass2()을 할 때 인수를 전달, 그렇게하지 않습니다 작동하지 않습니다. 인수를 전달하지 않고 myclass2을 인스턴스화 할 수있게하려면 __init__을 사용하여이를 허용해야합니다.

0

, 당신은 같은 myclass3 내부 myclass2 위해 무언가를 제공해야합니다 :

class myclass3(myclass1): 
    def __init__(self, arg1):   
     self.var2 = arg1    
     self.c2 = myclass2(5) 
관련 문제