वंशानुक्रम उपयोगी है, लेकिन आप बेस क्लास से कोड का पुन: उपयोग करके इसकी पूरी क्षमता को अनलॉक कर सकते हैं।
चाबी छीनना
- पायथन का सुपर() फ़ंक्शन आपको उपवर्ग से सुपरक्लास विधियों को कॉल करने की अनुमति देता है, जिससे इनहेरिटेंस और मेथड ओवरराइडिंग को लागू करना आसान हो जाता है।
- सुपर() फ़ंक्शन पायथन में मेथड रेजोल्यूशन ऑर्डर (एमआरओ) से निकटता से संबंधित है, जो उस क्रम को निर्धारित करता है जिसमें पूर्वज वर्गों को तरीकों या विशेषताओं के लिए खोजा जाता है।
- क्लास कंस्ट्रक्टर्स में सुपर() का उपयोग करना पैरेंट क्लास में सामान्य विशेषताओं और चाइल्ड क्लास में अधिक विशिष्ट विशेषताओं को आरंभ करने के लिए एक सामान्य अभ्यास है। सुपर() का उपयोग करने में विफल रहने से अनपेक्षित परिणाम हो सकते हैं, जैसे विशेषता आरंभीकरण का गायब होना।
पायथन की मुख्य विशेषताओं में से एक इसका OOP प्रतिमान है, जिसका उपयोग आप वास्तविक दुनिया की संस्थाओं और उनके संबंधों को मॉडल करने के लिए कर सकते हैं।
पायथन कक्षाओं के साथ काम करते समय, आप अक्सर इनहेरिटेंस का उपयोग करेंगे और सुपरक्लास की विशेषताओं या विधियों को ओवरराइड करेंगे। पायथन एक प्रदान करता है बहुत अच्छा() फ़ंक्शन जो आपको उपवर्ग से सुपरक्लास के तरीकों को कॉल करने देता है।
सुपर() क्या है और आपको इसकी आवश्यकता क्यों है?
इनहेरिटेंस का उपयोग करके, आप एक नया पायथन वर्ग बना सकते हैं जो मौजूदा वर्ग की विशेषताओं को प्राप्त करता है। आप वैकल्पिक कार्यान्वयन प्रदान करते हुए, उपवर्ग में सुपरक्लास के तरीकों को ओवरराइड भी कर सकते हैं। हालाँकि, हो सकता है कि आप पुरानी कार्यक्षमता के बजाय नई कार्यक्षमता का उपयोग करना चाहें। इस मामले में, बहुत अच्छा() उपयोगी है।
आप इसका उपयोग कर सकते हैं बहुत अच्छा() सुपरक्लास विशेषताओं तक पहुँचने और सुपरक्लास के तरीकों को लागू करने के लिए फ़ंक्शन। सुपर के लिए जरूरी है ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग क्योंकि इससे इनहेरिटेंस और मेथड ओवरराइडिंग को लागू करना आसान हो जाता है।
सुपर() कैसे काम करता है?
आंतरिक रूप से, बहुत अच्छा() से गहरा संबंध है विधि समाधान आदेश (एमआरओ) पायथन में, जिसे सी3 लीनियराइजेशन एल्गोरिदम निर्धारित करता है।
ऐसे बहुत अच्छा() काम करता है:
- वर्तमान वर्ग और उदाहरण निर्धारित करें: जब तुमने फोन किया बहुत अच्छा() एक उपवर्ग की एक विधि के अंदर, पायथन स्वचालित रूप से वर्तमान वर्ग (वह वर्ग जिसमें वह विधि शामिल है जिसे कॉल किया गया है) का पता लगाता है बहुत अच्छा()) और उस वर्ग का उदाहरण (अर्थात्, खुद).
- सुपरक्लास निर्धारित करें: बहुत अच्छा() दो तर्क लेता है—वर्तमान वर्ग और उदाहरण—जिन्हें आपको स्पष्ट रूप से पारित करने की आवश्यकता नहीं है। यह विधि कॉल को सौंपने के लिए सुपरक्लास को निर्धारित करने के लिए इस जानकारी का उपयोग करता है। यह वर्ग पदानुक्रम और एमआरओ की जांच करके ऐसा करता है।
- सुपरक्लास पर विधि लागू करें: एक बार जब यह सुपरक्लास निर्धारित हो जाता है, बहुत अच्छा() आपको इसके तरीकों को कॉल करने की अनुमति देता है जैसे कि आप उन्हें सीधे उपवर्ग से कॉल कर रहे थे। यह आपको सुपरक्लास से मूल कार्यान्वयन का उपयोग करते हुए तरीकों को विस्तारित या ओवरराइड करने में सक्षम बनाता है।
क्लास कंस्ट्रक्टर में सुपर() का उपयोग करना
का उपयोग करते हुए बहुत अच्छा() क्लास कंस्ट्रक्टर में यह सामान्य अभ्यास है, क्योंकि आप अक्सर पैरेंट क्लास में सामान्य विशेषताओं और बच्चे में अधिक विशिष्ट विशेषताओं को आरंभ करना चाहेंगे।
इसे प्रदर्शित करने के लिए, पायथन क्लास को परिभाषित करें, पिता, जो एक बेटा वर्ग को विरासत में मिला है:
classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_nameclassSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)self.age = age
self.hobby = hobbydefget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")
# Access attributes
print(son.get_info())
के अंदर बेटा कंस्ट्रक्टर, को कॉल करें सुपर().init() का आह्वान करता है पिता क्लास कंस्ट्रक्टर, इसे पास करना पहला नाम और उपनाम पैरामीटर के रूप में. यह सुनिश्चित करता है कि पिता क्लास अभी भी नाम विशेषताओं को सही ढंग से सेट कर सकता है, यहां तक कि ए पर भी बेटा वस्तु।
अगर आप कॉल नहीं करते बहुत अच्छा() किसी क्लास कंस्ट्रक्टर में, उसके पैरेंट क्लास का कंस्ट्रक्टर नहीं चलेगा। इससे अनपेक्षित परिणाम हो सकते हैं, जैसे विशेषता आरंभीकरण का गायब होना या मूल वर्ग की स्थिति का अधूरा सेटअप:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
यदि आप अब कॉल करने का प्रयास करते हैं जानकारी मिलना विधि, यह एक बढ़ाएगा विशेषतात्रुटि क्योंकि स्वयं.प्रथम_नाम और स्वयं.अंतिम_नाम विशेषताएँ प्रारंभ नहीं की गई हैं.
क्लास मेथड्स में सुपर() का उपयोग करना
आप उपयोग कर सकते हैं बहुत अच्छा() अन्य तरीकों में, कंस्ट्रक्टर्स के अलावा, बिल्कुल उसी तरह। यह आपको सुपरक्लास की पद्धति के व्यवहार को विस्तारित या ओवरराइड करने देता है।
classFather:
defspeak(self):
return"Hello from Father"classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"# Create an instance of the Son class
son = Son()# Call the speak method of the Son class
son_greeting = son.speak()
print(son_greeting)
बेटा वर्ग से विरासत में मिला है पिता और उसके पास है बोलना तरीका। बोलना की विधि बेटा वर्ग उपयोग सुपर().बोलें() को कॉल करने के लिए बोलना की विधि पिता कक्षा। यह इसे मूल वर्ग से संदेश को शामिल करने की अनुमति देता है जबकि इसे बाल वर्ग के लिए विशिष्ट संदेश के साथ विस्तारित करता है।
उपयोग करने में असफल होना बहुत अच्छा() ऐसी विधि में जो किसी अन्य को ओवरराइड करती है, इसका मतलब है कि मूल वर्ग विधि में मौजूद कार्यक्षमता प्रभावी नहीं होगी। इसके परिणामस्वरूप विधि व्यवहार का पूर्ण प्रतिस्थापन हो जाता है, जिससे वह व्यवहार हो सकता है जिसका आप इरादा नहीं रखते थे।
विधि समाधान आदेश को समझना
मेथड रेजोल्यूशन ऑर्डर (एमआरओ) वह क्रम है जिसमें जब आप किसी विधि या विशेषता तक पहुंचते हैं तो पायथन पूर्वजों की खोज करता है। एमआरओ पायथन को यह निर्धारित करने में मदद करता है कि एकाधिक वंशानुक्रम पदानुक्रम मौजूद होने पर किस विधि को कॉल करना है।
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
यहां बताया गया है कि जब आप इसका एक उदाहरण बनाते हैं तो क्या होता है लागोस क्लास करें और कॉल करें संस्कृति तरीका:
- पाइथॉन की तलाश शुरू होती है संस्कृति विधि में लागोस कक्षा ही. यदि उसे यह मिल जाता है, तो वह विधि को कॉल करता है। यदि नहीं, तो यह चरण दो पर आगे बढ़ता है।
- यदि यह नहीं मिलता है संस्कृति विधि में लागोस क्लास, पायथन बेस क्लास को उसी क्रम में देखता है जिस क्रम में वे क्लास परिभाषा में दिखाई देते हैं। इस मामले में, लागोस सबसे पहले विरासत में मिला है अफ़्रीका और फिर से नाइजीरिया. तो, पायथन इसकी तलाश करेगा संस्कृति विधि में अफ़्रीका पहला।
- यदि यह नहीं मिलता है संस्कृति विधि में अफ़्रीका क्लास, पायथन फिर इसमें दिखेगा नाइजीरिया कक्षा। यह व्यवहार तब तक जारी रहता है जब तक कि यह पदानुक्रम के अंत तक नहीं पहुंच जाता है और यदि यह किसी भी सुपरक्लास में विधि नहीं ढूंढ पाता है तो एक त्रुटि उत्पन्न करता है।
आउटपुट का मेथड रिज़ॉल्यूशन ऑर्डर दिखाता है लागोस, बाएँ से दाएँ शुरू करते हुए।
सामान्य ख़तरे और सर्वोत्तम प्रथाएँ
जब साथ काम कर रहे हों बहुत अच्छा(), बचने के लिए कुछ सामान्य नुकसान हैं।
- विधि समाधान आदेश का ध्यान रखें, विशेष रूप से एकाधिक वंशानुक्रम परिदृश्यों में। यदि आपको जटिल एकाधिक वंशानुक्रम का उपयोग करने की आवश्यकता है, तो आपको इससे परिचित होना चाहिए C3 रैखिकरण एल्गोरिथ्म वह पायथन एमआरओ निर्धारित करने के लिए उपयोग करता है।
- अपने वर्ग पदानुक्रम में चक्रीय निर्भरता से बचें, जिससे अप्रत्याशित व्यवहार हो सकता है।
- अपना कोड स्पष्ट रूप से दस्तावेज़ित करें, विशेषकर उपयोग करते समय बहुत अच्छा() जटिल वर्ग पदानुक्रम में, इसे अन्य डेवलपर्स के लिए अधिक समझने योग्य बनाने के लिए।
सुपर() का सही तरीके से उपयोग करें
अजगर का बहुत अच्छा() जब आप इनहेरिटेंस और मेथड ओवरराइडिंग के साथ काम कर रहे हों तो फ़ंक्शन एक शक्तिशाली सुविधा है। कैसे समझें बहुत अच्छा() काम करता है और सर्वोत्तम प्रथाओं का पालन करने से आप अपने पायथन प्रोजेक्ट्स में अधिक रखरखाव योग्य और कुशल कोड बना सकेंगे।