python - सुपर कन्स्ट्रक्टर का आह्वान कैसे करें?




class inheritance (4)

class A:
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"

B()
hello

सुपर कन्स्ट्रक्टर के साथ काम करने वाली अन्य सभी भाषाओं में पूरी तरह से लागू किया गया है। पाइथन में इसे कैसे आमंत्रित किया जाता है? मैं super(self) उम्मीद करता हूं लेकिन यह काम नहीं करता है।


अन्य उत्तरों के अनुरूप, सुपर क्लास विधियों (कन्स्ट्रक्टर समेत) को कॉल करने के कई तरीके हैं, हालांकि पायथन-3.x में प्रक्रिया को सरल बनाया गया है:

अजगर-2.x

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(B, self).__init__()

अजगर-3.x

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()

super() अब दस्तावेज़ों के अनुसार super(<containing classname>, self) के बराबर है


एक तरीका है ए के कन्स्ट्रक्टर को कॉल करना और self को तर्क के रूप में पास करना, जैसे:

class B(A):
    def __init__(self):
        A.__init__(self)
        print "hello"

इस शैली का लाभ यह है कि यह बहुत स्पष्ट है। यह ए के कन्स्ट्रक्टर को कॉल करता है। नकारात्मकता यह है कि यह हीरे के आकार की विरासत को बहुत अच्छी तरह से संभाल नहीं पाती है, क्योंकि आप साझा बेस क्लास के कन्स्ट्रक्टर को दो बार कॉल करना समाप्त कर सकते हैं।

एक और तरीका सुपर () का उपयोग करना है, जैसा कि अन्य ने दिखाया है। एकल विरासत के लिए, यह मूल रूप से वही बात करता है जैसे आप माता-पिता के निर्माता को कॉल करते हैं।

हालांकि, सुपर () काफी हद तक जटिल है और कभी-कभी कई विरासत स्थितियों में प्रति-सहज हो सकता है। प्लस तरफ, सुपर () हीरा के आकार की विरासत को संभालने के लिए इस्तेमाल किया जा सकता है। यदि आप सुपर () करता है, तो यह जानना चाहते हैं कि सुपर () क्या करता है, इस बारे में सबसे अच्छा स्पष्टीकरण यहां पाया गया here (हालांकि मैं उस आलेख की राय का समर्थन नहीं कर रहा हूं)।


मैं निम्नलिखित सूत्रों का उपयोग करता हूं जो पिछले उत्तरों को बढ़ाता है:

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(self.__class__, self).__init__()

B()

इस तरह आपको सुपर में कॉल में कक्षा का नाम दोहराना नहीं है। यदि आप बड़ी संख्या में कक्षाओं को कोड कर रहे हैं, तो यह आसान हो सकता है, और कक्षा कोड से स्वतंत्र कन्स्ट्रक्टर विधियों में अपना कोड बनाना चाहता है।


super() नए-शैली वर्गों में अभिभावक जैसी वस्तु देता है :

class A(object):
    def __init__(self):
        print "world"

class B(A):
    def __init__(self):
        print "hello"
        super(B, self).__init__()

B()




superclass