이 질문에는 이미 답변이 있습니다.
이것을 고려해보십시오 - A에서 상속받은 B 클래스, B에서 상속받은 C 클래스, 생성자에서 부모 클래스 생성자를 호출하는 일반적인 방법은 무엇입니까? 그래도 여전히 너무 애매한 경우 여기에 몇 가지 코드가 있습니다.
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
이것이 내가 지금하는 방법이다. 그러나 여전히 너무 비 범용적인 것으로 보입니다. 올바른 유형을 수동으로 전달해야합니다.
자, 나는self.__class__
super ()에 대한 첫 번째 인수로 사용되지만 분명히 작동하지 않습니다. C의 생성자에 넣으면 B의 생성자가 호출됩니다. B에서 똑같이하면 "self"는 여전히 C의 인스턴스를 가리 키므로 결국 B의 생성자를 다시 호출하게됩니다 (이 작업은 무한 재귀에서 끝납니다).
지금 다이아몬드 상속에 대해 생각할 필요가 없습니다. 저는이 특정 문제를 해결하는 데 관심이 있습니다.
실제로 파이썬 2.x에서 사용하는 방식을 권장합니다.
클래스가 명시 적으로 전달되는지 여부에 대한 문제super
기능보다는 스타일의 문제입니다. 수업을 들으려면super
파이썬의 철학은 "암묵적보다 낫다"라는 철학에 적합합니다.
TypeError: super() argument 1 must be type, not classobj
이 방법을 사용합니다. 내가 놓친 게 있니? - Leopdsuper()
새로운 스타일의 클래스에서만 작동합니다. 즉,에서 상속해야합니다.object
. - dF.
파이썬 3에는 다음과 같이 사용할 수있는 향상된 super ()가 포함되어 있습니다 :
super().__init__(args)
MyClassName.mro()
. 내가 틀릴 수도 있지만 첫 번째 지정된 부모가__init__
호출됩니다. - Cam Jackson
다음과 같이 간단하게 작성할 수 있습니다.
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
A.__init__(self)
#A.__init__(self,<parameters>) if you want to call with parameters
print "Constructor B was called"
class C(B):
def __init__(self):
#A.__init__(self) #if you want to call most super class...
B.__init__(self)
print "Constructor C was called"