पायथन की सुपर() और __init__() विधियों की खोज

Python

पायथन के सुपर के साथ शुरुआत करना ()

पायथन के ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में सुपर() फ़ंक्शन का उपयोग अक्सर शुरुआती लोगों के लिए भ्रम का स्रोत होता है। इस शक्तिशाली फ़ंक्शन का उपयोग मुख्य रूप से यह सुनिश्चित करने के लिए किया जाता है कि बेस क्लास के __init__() तरीकों को ठीक से बुलाया जाता है, जिससे अधिक रखरखाव योग्य और स्केलेबल कोड संरचना की सुविधा मिलती है।

इस लेख में, हम Base.__init__() और super().__init__() के उपयोग के बीच के अंतरों पर गौर करेंगे, और पता लगाएंगे कि सुपर() आम तौर पर पसंदीदा तरीका क्यों है। हम इन अवधारणाओं को व्यवहार में दर्शाने के लिए कोड उदाहरण भी प्रदान करेंगे।

आज्ञा विवरण
Base.__init__(self) बेस क्लास की __init__ विधि को सीधे कॉल करता है। यह सुनिश्चित करने के लिए उपयोग किया जाता है कि बेस क्लास ठीक से प्रारंभ किया गया है।
super(ChildB, self).__init__() सुपर() फ़ंक्शन का उपयोग करके बेस क्लास की __init__ विधि को कॉल करता है। बेस क्लास आरंभ करने के लिए यह पसंदीदा तरीका है।
print("Base created") कंसोल पर एक संदेश प्रिंट करता है। डिबगिंग और पुष्टि करने के लिए उपयोग किया जाता है कि बेस क्लास प्रारंभ कर दिया गया है।
print("ChildA created") कंसोल पर एक संदेश प्रिंट करता है। यह पुष्टि करने के लिए उपयोग किया जाता है कि चाइल्डए बनाया और आरंभ किया गया है।
print("ChildB created") कंसोल पर एक संदेश प्रिंट करता है। यह पुष्टि करने के लिए उपयोग किया जाता है कि चाइल्डबी बनाया और आरंभ किया गया है।
print("Derived class with Base.__init__") एक संदेश प्रिंट करता है जो दर्शाता है कि व्युत्पन्न वर्ग को Base.__init__ का उपयोग करके प्रारंभ किया गया था।
print("Derived class with super().__init__") एक संदेश प्रिंट करता है जो दर्शाता है कि व्युत्पन्न वर्ग को सुपर().__init__ का उपयोग करके प्रारंभ किया गया था।

पायथन के सुपर() उपयोग की गहराई से व्याख्या

ऊपर दी गई स्क्रिप्ट इसके उपयोग को दर्शाती है और पायथन में एक वर्ग पदानुक्रम के भीतर आधार वर्गों को आरंभ करने के लिए। पहली स्क्रिप्ट में, हम एक बेस क्लास को परिभाषित करते हैं जिसे कहा जाता है एक साथ __init__() वह विधि जो कक्षा का एक उदाहरण आरंभ होने पर "आधार निर्मित" प्रिंट करती है। फिर हम दो व्युत्पन्न वर्गों को परिभाषित करते हैं, और . में , द Base.__init__(self) विधि को स्पष्ट रूप से अपने भीतर बुलाया जाता है यह सुनिश्चित करने की विधि कि आधार वर्ग उचित रूप से प्रारंभ किया गया है। यह दृष्टिकोण सीधा है लेकिन कई आधार वर्ग या जटिल विरासत संरचना होने पर बोझिल हो सकता है।

में , द इसके स्थान पर विधि का प्रयोग किया जाता है। पायथन में फ़ंक्शन बेस क्लास विधियों को कॉल करने का एक अधिक लचीला और रखरखाव योग्य तरीका है, खासकर एकाधिक विरासत परिदृश्यों में। यह विधि समाधान आदेश (एमआरओ) का पालन करते हुए स्वचालित रूप से सही क्रम में कॉल की जाने वाली विधि का समाधान करता है। यह न केवल कोड को सरल बनाता है बल्कि इसे वर्ग पदानुक्रम में परिवर्तनों के लिए अधिक मजबूत और अनुकूलनीय भी बनाता है। दूसरी लिपि प्रत्यक्ष उपयोग की तुलना करके इन अवधारणाओं को और विस्तार से बताती है Base.__init__() और यह फ़ंक्शन, यह दर्शाता है कि प्रत्येक विधि आरंभीकरण प्रक्रिया को कैसे प्रभावित करती है।

क्लास इनहेरिटेंस में पायथन के सुपर() को समझना

पायथन - बेस क्लास __init__() को कॉल करने के लिए सुपर() का उपयोग करना

class Base(object):
    def __init__(self):
        print("Base created")

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)
        print("ChildA created")

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()
        print("ChildB created")

ChildA()
ChildB()

बेस क्लास इनिशियलाइज़ेशन में अंतर तलाशना

पायथन - Base.__init__() बनाम super().__init__() की तुलना

class Base:
    def __init__(self):
        print("Base class initialized")

class DerivedWithBaseInit(Base):
    def __init__(self):
        Base.__init__(self)
        print("Derived class with Base.__init__")

class DerivedWithSuperInit(Base):
    def __init__(self):
        super().__init__()
        print("Derived class with super().__init__")

print("Creating DerivedWithBaseInit:")
derived1 = DerivedWithBaseInit()

print("Creating DerivedWithSuperInit:")
derived2 = DerivedWithSuperInit()

पायथन के सुपर() फ़ंक्शन में गहराई से गोता लगाना

जबकि पिछली व्याख्याएँ इसके मूल उपयोग पर केंद्रित थीं और , उपयोग के कुछ उन्नत पहलुओं और लाभों को समझना महत्वपूर्ण है . एक प्रमुख लाभ एकाधिक वंशानुक्रम के साथ इसकी अनुकूलता है। एक जटिल वर्ग पदानुक्रम में, जहां एक वर्ग कई आधार वर्गों से विरासत में मिल सकता है, का उपयोग करते हुए super() यह सुनिश्चित करता है कि सभी आधार वर्गों को विधि रिज़ॉल्यूशन ऑर्डर (एमआरओ) के अनुसार ठीक से प्रारंभ किया गया है। यह उन संभावित समस्याओं को रोकता है जहां बेस क्लास को कई बार प्रारंभ किया जा सकता है या बिल्कुल भी नहीं।

एक अन्य महत्वपूर्ण पहलू कोड की बेहतर पठनीयता और रखरखाव है। उपयोग करते समय , प्रोग्रामर को स्पष्ट रूप से बेस क्लास का नाम देना होगा, जिससे कोड कम लचीला हो जाएगा। यदि आधार वर्ग का नाम बदलता है या विरासत संरचना विकसित होती है, तो प्रत्येक प्रत्यक्ष कॉल अद्यतन करने की आवश्यकता है. इसके विपरीत, बेस क्लास नाम को अमूर्त कर देता है, जिससे कोड परिवर्तनों के प्रति अधिक अनुकूल हो जाता है। यह अमूर्तता बहुरूपता और एनकैप्सुलेशन के सिद्धांतों के साथ भी संरेखित होती है, जो ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में मौलिक हैं।

पायथन के सुपर() के बारे में सामान्य प्रश्न और उत्तर

  1. क्या है पायथन में?
  2. एक अंतर्निहित फ़ंक्शन है जो आपको माता-पिता या भाई-बहन वर्ग से विधियों को कॉल करने की अनुमति देता है, जो विरासत पदानुक्रम में उचित आरंभीकरण और विधि समाधान सुनिश्चित करता है।
  3. कैसे हुआ से अलग ?
  4. एमआरओ के आधार पर कॉल की जाने वाली विधि को गतिशील रूप से हल करता है सीधे एक विशिष्ट बेस क्लास पद्धति को कॉल करता है, जो कम लचीली होती है।
  5. क्यों एकाधिक वंशानुक्रम में पसंदीदा?
  6. एकाधिक विरासत में, यह सुनिश्चित करता है कि सभी आधार वर्गों को एमआरओ के अनुसार ठीक से आरंभ किया गया है, डुप्लिकेट या लापता आरंभीकरण से बचा जा रहा है।
  7. कर सकना के बाहर उपयोग किया जाए ?
  8. हाँ, न केवल माता-पिता या भाई-बहन वर्ग से किसी भी विधि को कॉल करने के लिए उपयोग किया जा सकता है .
  9. विधि समाधान आदेश (एमआरओ) क्या है?
  10. एमआरओ वह क्रम है जिसमें पायथन कक्षाओं के पदानुक्रम में तरीकों की तलाश करता है। यह C3 रैखिकरण एल्गोरिथ्म द्वारा निर्धारित किया जाता है।
  11. आप किसी कक्षा के एमआरओ को कैसे देखते हैं?
  12. आप इसका उपयोग करके एमआरओ देख सकते हैं विधि या गुण।
  13. अगर आप उपयोग नहीं करेंगे तो क्या होगा एक व्युत्पन्न वर्ग में?
  14. यदि आप उपयोग नहीं करते हैं , बेस क्लास को ठीक से प्रारंभ नहीं किया जा सकता है, जिससे संभावित त्रुटियां या अप्रत्याशित व्यवहार हो सकता है।
  15. क्या इसका उपयोग संभव है पायथन 2 में?
  16. हाँ, लेकिन वाक्यविन्यास अलग है। पायथन 2 में, आप उपयोग करते हैं , जबकि Python 3 में, आप बस उपयोग करते हैं .

का उपयोग करते हुए पायथन में न केवल बेस क्लासों का उचित आरंभीकरण सुनिश्चित होता है, बल्कि कोड लचीलापन और रखरखाव भी बढ़ता है। यह कई इनहेरिटेंस परिदृश्यों में विशेष रूप से फायदेमंद है जहां बेस क्लास विधियों पर सीधी कॉल बोझिल और त्रुटि-प्रवण हो सकती है। बेस क्लास नामों को अमूर्त करके, स्वच्छ और अधिक अनुकूलनीय कोड की अनुमति देता है। की बारीकियों को समझना बनाम Base.__init__() मजबूत ऑब्जेक्ट-ओरिएंटेड पायथन कोड लिखने के लिए आवश्यक है।