कहो कि मेरे पास एक बहु विरासत परिदृश्य है:
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
किसी तीसरे पक्ष के पुस्तकालय से हैं, तो क्या होगा? क्या कोई दृष्टिकोण है जो यह सुनिश्चित कर सकता है कि सभी मूल वर्ग निर्माणकर्ताओं को बुलाया जाता है (और सही क्रम में, और केवल एक बार)?
संपादित करें: यह देखने के लिए कि मेरा क्या मतलब है, अगर मैं:
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
इनिट को कभी नहीं बुलाया जाता है। इसलिए ऐसा लगता है कि जब तक मैं उन कक्षाओं की इनिट्स को नहीं जानता / नियंत्रित नहीं करता ( A
और B
) मैं जिस क्लास (मैं लिख रहा हूं C
) के लिए एक सुरक्षित विकल्प नहीं बना सकता ।