पायथनच्या सुपर() आणि __init__() पद्धती एक्सप्लोर करत आहे

पायथनच्या सुपर() आणि __init__() पद्धती एक्सप्लोर करत आहे
पायथनच्या सुपर() आणि __init__() पद्धती एक्सप्लोर करत आहे

पायथनच्या सुपर () सह प्रारंभ करणे

पायथनच्या ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंगमध्ये सुपर() फंक्शनचा वापर नवशिक्यांसाठी गोंधळाचे कारण आहे. हे शक्तिशाली फंक्शन मुख्यतः बेस क्लासेसच्या __init__() पद्धती योग्यरित्या कॉल केल्या गेल्या आहेत याची खात्री करण्यासाठी वापरली जाते, अधिक देखरेख करण्यायोग्य आणि स्केलेबल कोड संरचना सुलभ करते.

या लेखात, आम्ही Base.__init__() आणि super().__init__() वापरण्यातील फरक शोधू, आणि सामान्यतः super() हा प्राधान्यक्रम का आहे ते शोधू. या संकल्पना व्यवहारात स्पष्ट करण्यासाठी आम्ही कोड उदाहरणे देखील देऊ.

आज्ञा वर्णन
Base.__init__(self) बेस क्लासच्या __init__ पद्धतीला थेट कॉल करते. बेस क्लास योग्यरितीने सुरू केल्याचे सुनिश्चित करण्यासाठी वापरले जाते.
super(ChildB, self).__init__() super() फंक्शन वापरून बेस क्लासची __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__ वापरून व्युत्पन्न वर्ग सुरू करण्यात आला होता हे दर्शविणारा संदेश छापतो.

पायथनच्या सुपर() वापराचे सखोल स्पष्टीकरण

वर दिलेल्या स्क्रिप्ट्सचा वापर स्पष्ट करतात super() आणि पायथनमध्ये वर्ग पदानुक्रमात बेस क्लासेस सुरू करण्यासाठी. पहिल्या स्क्रिप्टमध्ये, आम्ही बेस क्लास परिभाषित करतो Base सह __init__() क्लासचे उदाहरण सुरू केल्यावर "बेस तयार" मुद्रित करणारी पद्धत. त्यानंतर आम्ही दोन व्युत्पन्न वर्ग परिभाषित करतो, ChildA आणि . मध्ये ChildA, द पद्धत स्पष्टपणे स्वतःच्या आत म्हणतात __init__() बेस क्लास योग्यरितीने सुरू केल्याची खात्री करण्यासाठी पद्धत. हा दृष्टीकोन सरळ आहे परंतु एकाधिक बेस क्लासेस किंवा जटिल वारसा संरचना असल्यास ते त्रासदायक असू शकते.

मध्ये , द super(ChildB, self).__init__() त्याऐवजी पद्धत वापरली जाते. द super() पायथनमधील फंक्शन हा बेस क्लास मेथड कॉल करण्याचा अधिक लवचिक आणि देखरेख करण्यायोग्य मार्ग आहे, विशेषत: एकाधिक इनहेरिटन्स परिस्थितींमध्ये. मेथड रिझोल्यूशन ऑर्डर (MRO) चे अनुसरण करून ते योग्य क्रमाने कॉल करण्याच्या पद्धतीचे स्वयंचलितपणे निराकरण करते. हे केवळ कोड सुलभ करत नाही तर वर्ग पदानुक्रमातील बदलांना अधिक मजबूत आणि अनुकूल बनवते. च्या थेट वापराची तुलना करून दुसरी स्क्रिप्ट या संकल्पनांवर अधिक तपशीलवार वर्णन करते आणि ते super() फंक्शन, प्रत्येक पद्धत प्रारंभ प्रक्रियेवर कसा परिणाम करते हे दर्शविते.

क्लास इनहेरिटन्समध्ये पायथनचे सुपर() समजून घेणे

पायथन - बेस क्लास __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()

बेस क्लास इनिशियलायझेशनमधील फरक एक्सप्लोर करणे

पायथन - बेस तुलना करणे.__init__() वि सुपर().__init__()

पायथनच्या सुपर() फंक्शनमध्ये अधिक खोलवर जाणे

मागील स्पष्टीकरणे मूलभूत वापरावर केंद्रित असताना super() आणि , वापरण्याचे काही प्रगत पैलू आणि फायदे समजून घेणे महत्त्वाचे आहे super(). एक महत्त्वाचा फायदा म्हणजे त्याची एकाधिक वारसाशी सुसंगतता. क्लिष्ट वर्ग पदानुक्रमात, जेथे वर्ग बहुविध बेस क्लासेसमधून वारसा मिळवू शकतो, वापरून super() मेथड रिझोल्यूशन ऑर्डर (MRO) नुसार सर्व बेस क्लास योग्यरितीने सुरू केले आहेत याची खात्री करते. हे संभाव्य समस्यांना प्रतिबंधित करते जेथे बेस क्लास अनेक वेळा सुरू केला जाऊ शकतो किंवा अजिबात नाही.

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

Python's super() बद्दल सामान्य प्रश्न आणि उत्तरे

  1. काय आहे super() पायथन मध्ये?
  2. super() हे एक अंगभूत फंक्शन आहे जे तुम्हाला पालक किंवा भावंड वर्गाकडून पद्धती कॉल करण्यास अनुमती देते, वारसा पदानुक्रमामध्ये योग्य आरंभ आणि पद्धत निराकरण सुनिश्चित करते.
  3. कसे super() पेक्षा वेगळे ?
  4. super() MRO वर आधारित कॉल करण्याच्या पद्धतीचे डायनॅमिकरित्या निराकरण करते, तर थेट विशिष्ट बेस क्लास पद्धत कॉल करते, जी कमी लवचिक असते.
  5. का आहे super() एकाधिक वारसा मध्ये प्राधान्य?
  6. एकाधिक वारसा मध्ये, super() डुप्लिकेट किंवा गहाळ इनिशिएलायझेशन टाळून, MRO नुसार सर्व बेस क्लास योग्यरित्या सुरू केले आहेत याची खात्री करते.
  7. करू शकतो super() च्या बाहेर वापरावे __init__()?
  8. होय, super() पालक किंवा भावंड वर्गाकडून कोणत्याही पद्धतीला कॉल करण्यासाठी वापरले जाऊ शकते, फक्त नाही __init__().
  9. मेथड रिझोल्यूशन ऑर्डर (MRO) म्हणजे काय?
  10. MRO हा क्रम आहे ज्यामध्ये पायथन वर्गांच्या पदानुक्रमात पद्धती शोधते. हे C3 रेखीयकरण अल्गोरिदमद्वारे निर्धारित केले जाते.
  11. तुम्ही वर्गाचा MRO कसा पाहता?
  12. तुम्ही वापरून MRO पाहू शकता ३३ पद्धत किंवा ३४ विशेषता
  13. आपण वापरत नसल्यास काय होईल super() व्युत्पन्न वर्गात?
  14. आपण वापरत नसल्यास super(), बेस क्लास योग्यरितीने सुरू होऊ शकत नाही, ज्यामुळे संभाव्य त्रुटी किंवा अनपेक्षित वर्तन होऊ शकते.
  15. वापरणे शक्य आहे का super() पायथन 2 मध्ये?
  16. होय, पण वाक्यरचना वेगळी आहे. पायथन 2 मध्ये, तुम्ही वापरता ३८, तर Python 3 मध्ये, तुम्ही फक्त वापरता super().method().

मुख्य संकल्पना गुंडाळणे

वापरत आहे super() पायथॉनमध्ये बेस क्लासेसची योग्य सुरुवातच नाही तर कोडची लवचिकता आणि देखभालक्षमता देखील वाढते. बहुविध वारसा परिस्थितींमध्ये हे विशेषतः फायदेशीर आहे जेथे बेस क्लास पद्धतींना थेट कॉल करणे त्रासदायक आणि त्रुटी-प्रवण बनू शकते. बेस क्लास नावांचा गोषवारा करून, super() क्लिनर आणि अधिक अनुकूल कोडसाठी अनुमती देते. च्या बारकावे समजून घेणे super() विरुद्ध मजबूत ऑब्जेक्ट-ओरिएंटेड पायथन कोड लिहिण्यासाठी आवश्यक आहे.