多重継承シナリオがあるとしましょう:
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?
書き込みには、2つの典型的なアプローチがありますC
のは__init__
:
- (旧式)
ParentClass.__init__(self)
- (新しいスタイル)
super(DerivedClass, self).__init__()
ただし、どちらの場合でも、親クラス(A
とB
)が同じ規則に従っていない場合、コードは正しく機能しません(一部が見つからないか、複数回呼び出される可能性があります)。
では、正しい方法は何でしょうか?「ただ一貫している、どちらか一方に従っている」と言うのは簡単ですが、サードパーティのライブラリからのものである場合、A
またはB
サードパーティのライブラリからのものである場合はどうでしょうか。すべての親クラスのコンストラクターが(正しい順序で、1回だけ)呼び出されるようにする方法はありますか?
編集:私がそうしている場合、私が何を意味するかを確認するには:
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
initが2回呼び出されることに注意してください。私が行った場合:
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
)。