다중 상속 시나리오가 있다고 가정 해보십시오.
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
작성하는 두 가지 일반적인 방법있다 C
'들 __init__
:
- (오래된 스타일)
ParentClass.__init__(self)
- (최신 스타일)
super(DerivedClass, self).__init__()
그러나 어느 경우 든 상위 클래스 ( A
및 B
) 가 동일한 규칙을 따르지 않으면 코드가 제대로 작동하지 않습니다 (일부 누락되거나 여러 번 호출 될 수 있음).
다시 올바른 방법은 무엇입니까? 그것은하지만, 경우에 "둘 중 하나를 따르 단지 일치"말을 쉽게 A
또는 B
무엇을 한 후, 제 3 자 라이브러리에서입니까? 모든 부모 클래스 생성자가 호출되고 올바른 순서로 한 번만 호출되도록하는 방법이 있습니까?
편집 : 내가 의미하는 바를 보려면 :
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
A.__init__(self)
B.__init__(self)
print("Leaving C")
그럼 나는 얻는다 :
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
주의 B
의 초기화가 두 번 호출됩니다. 만약 내가한다면:
class A(object):
def __init__(self):
print("Entering A")
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
super(C, self).__init__()
print("Leaving C")
그럼 나는 얻는다 :
Entering C
Entering A
Leaving A
Leaving C
주의 B
의 호출 결코 극복 init로 '. 따라서 내가 상속 한 클래스의 init을 알거나 제어하지 않으면 ( A
및 B
) 작성중인 클래스를 안전하게 선택할 수 없습니다 ( C
).