पायथन इनहेरिटेंस तब होता है जब एक सबक्लास दूसरी क्लास के कोड का उपयोग करता है। ऑब्जेक्ट-ओरिएंटेड भाषाओं जैसे पायथन में इनहेरिटेंस एक आवश्यक विशेषता है जो कोडिंग को आसान और अधिक कुशल बनाती है।
पायथन इनहेरिटेंस का परिचय
पायथन एक ऑब्जेक्ट-ओरिएंटेड भाषा है, जिसका अर्थ है कि यह कोड के पुन: प्रयोज्य ब्लॉक बनाने का समर्थन करती है ताकि कोड को अधिक कुशल बनाया जा सके। ऐसा होने का एक तरीका इनहेरिटेंस है, जहां एक सबक्लास दूसरी क्लास के कोड का उपयोग कर सकता है।
उदाहरण के लिए, आपके पास एक क्लास हो सकती है जो "बैंक खातों" को संग्रहीत करती है, और आप एक सबक्लास बनाना चाहते हैं जो "गोल्ड बैंक खातों" को संग्रहीत करे जो मौजूदा "बैंक खातों" क्लास में विशेषताओं को संदर्भित कर सके।
इस ट्यूटोरियल में, हम पायथन में इनहेरिटेंस की मूल बातें समझाएंगे। हम यह भी चर्चा करेंगे कि पेरेंट और चाइल्ड पायथन क्लास कैसे काम करते हैं, और क्लास ऑब्जेक्ट के साथ काम करते समय विशेषताओं और विधियों को कैसे ओवरराइड किया जाए।
पायथन इनहेरिटेंस क्या है?
इनहेरिटेंस एक ऐसा शब्द है जिसका उपयोग दूसरी क्लास के भीतर एक पायथन क्लास का वर्णन करने के लिए किया जाता है। सबक्लास या चाइल्ड क्लास कहलाने वाली क्लासेस पेरेंट क्लास से मान प्राप्त कर सकती हैं, ठीक वैसे ही जैसे वास्तविक दुनिया में बच्चे अपने माता-पिता से विशेषताएं प्राप्त करते हैं।
इनहेरिटेंस उपयोगी है क्योंकि यह हमें सबक्लास बनाने की अनुमति देता है जिनमें पेरेंट क्लास के समान मान प्रकार होते हैं, बिना उन प्रकारों को कई बार घोषित किए।
पेरेंट क्लास
पेरेंट क्लास (जिन्हें बेस क्लास भी कहा जाता है) वह मास्टर संरचना बनाते हैं जिसे सबक्लास एक्सेस कर सकते हैं। हम सामान्य मूल्यों के समान सेट को बार-बार घोषित किए बिना कई सबक्लास बना सकते हैं जो पेरेंट क्लास से प्राप्त विधियों से व्युत्पन्न होते हैं।
आइए एक उदाहरण का उपयोग करके समझते हैं कि यह व्यवहार में कैसे काम करेगा। मान लें कि हमारे पास एक प्रोग्राम है जो दो अलग-अलग बैंक खाता प्रकारों के साथ काम करता है: पेरेंट और चाइल्ड।
ये दोनों खाते बैंक खाते हैं, इसलिए इनमें समान मूल्य होंगे। लेकिन प्रत्येक खाते को अपनी विशिष्ट जानकारी की आवश्यकता हो सकती है। उदाहरण के लिए, एक पेरेंट का खाता ओवरड्राफ्ट का समर्थन कर सकता है, जबकि चाइल्ड का खाता केवल उनकी शेष राशि के साथ काम कर सकता है।
इसलिए, यदि हम इन मूल्यों के साथ एक प्रोग्राम बनाना चाहते हैं, तो हम पहले अपने बैंक खाते के लिए एक क्लास परिभाषित करेंगे (एक पेरेंट क्लास) फिर उन दो प्रकार के बैंक खातों के लिए चाइल्ड क्लास बनाएंगे जिन्हें हम समर्थन देना चाहते हैं - पेरेंट और चाइल्ड।
पेरेंट क्लास का उदाहरण
यहां बैंक खाते के लिए एक पेरेंट क्लास घोषित करने का एक उदाहरण है:
class BankAccount:
def __init__(self, forename, surname, balance):
self.forename = forename
self.surname = surname
self.balance = balance
हमने BankAccount क्लास बनाई है जो तीन मान संग्रहीत करती है: फोरनेम, सरनेम, और बैलेंस। हम अपनी क्लास में विधियां भी जोड़ सकते हैं, जैसे:
class BankAccount:
def __init__(self, forename, surname, balance):
self.forename = forename
self.surname = surname
self.balance = balance
def getDetails(self):
print("Forename: ", self.forename)
print("Surname: ", self.surname)
def getBalance(self):
print("Balance: $ ", self.balance)
हमारी क्लास अब तीन मान संग्रहीत करती है, साथ ही दो नई विधियां: डिटेल्स और बैलेंस। डिटेल्स विधि का उपयोग हमारे खाताधारक का फोरनेम और सरनेम जानने के लिए किया जा सकता है, और बैलेंस विधि खाताधारक की शेष राशि लौटाएगी।
BankAccount क्लास में घोषित हर विधि और वेरिएबल हमारी चाइल्ड क्लास में एक्सेसिबल होगी।
क्लास को कार्यरत देखना
आइए एक उदाहरण बैंक खाता बनाते हैं। हम निम्न कोड का उपयोग करके ऐसा कर सकते हैं:
account = BankAccount("John", "Appleseed", 100)
यह John Appleseed के लिए एक खाता बनाएगा जिसमें $100 हैं। अब हमारे पास अपना खाता तैयार है, हम इसे किसी अन्य क्लास की तरह संदर्भित करना शुरू कर सकते हैं। यहां हमारे बैंक खाते में getBalance() विधि चलाने का एक उदाहरण है ताकि पता चल सके कि हमारे पास कितना पैसा है:
print(account.getBalance())
हमारा प्रोग्राम निम्नलिखित लौटाता है:
Balance: $ 100
चाइल्ड क्लास
ऊपर के उदाहरण में, हमने एक पेरेंट क्लास घोषित की जो बैंक खातों को संग्रहीत करती है। लेकिन क्या होगा यदि हम एक विशिष्ट प्रकार के खाते के बारे में जानकारी संग्रहीत करना चाहते हैं जैसे 18 वर्ष से कम उम्र के बच्चे का अंडर-18 खाता? यहीं चाइल्ड क्लास काम आती हैं।
चाइल्ड क्लास, या सबक्लास, पेरेंट क्लास से मान प्राप्त करती हैं। इसका अर्थ है कि प्रत्येक चाइल्ड क्लास हमारी पेरेंट क्लास में घोषित विधियों और वेरिएबल को संदर्भित कर सकेगी।
तो, मान लें कि हम ChildBankAccount के लिए एक चाइल्ड क्लास बनाना चाहते हैं। यह खाता उपयोगकर्ता की बैंक खाता जानकारी - उनका नाम और शेष राशि - लौटाने में सक्षम होना चाहिए और इसमें रिस्ट्रिक्टेड नामक एक नया मान भी होना चाहिए। यह मान चाइल्ड के खाते पर संग्रहीत किया जाएगा क्योंकि वे 18 वर्ष से कम उम्र के हैं, और पूर्ण बैंक खाते के लिए पात्र नहीं हैं।
चाइल्ड क्लास बनाना
चाइल्ड क्लास बनाने के लिए, हम निम्न कोड का उपयोग कर सकते हैं:
class ChildBankAccount(BankAccount):
ChildBankAccount क्लास BankAccount क्लास की चाइल्ड बन जाती है क्योंकि BankAccount कोष्ठक के भीतर संलग्न है। यदि हम चाहते हैं कि हमारी चाइल्ड क्लास में हमारी पेरेंट क्लास - BankAccount - के समान ही मान हों, तो हम पास कीवर्ड का उपयोग इस तरह कर सकते हैं:
class ChildBankAccount(BankAccount): pass
लेकिन जैसा कि हमने पहले चर्चा की, हमारे चाइल्ड खाते को एक विशेष मान संग्रहीत करने की आवश्यकता होगी: एक वेरिएबल जो बताता है कि उपयोगकर्ता का खाता प्रतिबंधित है।
इस लक्ष्य को पूरा करने के लिए, हम अपनी चाइल्ड क्लास में रिस्ट्रिक्टेड नामक एक नया मान जोड़ने जा रहे हैं। हम इसे निम्न कोड का उपयोग करके कर सकते हैं:
class ChildBankAccount(BankAccount):
def __init__(self, forename, surname, balance, restricted=True):
self.forename = forename
self.surname = surname
self.balance = balance
self.restricted = restricted
def isRestricted(self):
print("This account is restricted as the user is under 18.")
आइए अपने कोड को समझते हैं।
उपरोक्त कोड में, हम बताते हैं कि हम चाहते हैं कि हमारे ChildBankAccounts चार मान रखें: फोरनेम, सरनेम, बैलेंस, और रिस्ट्रिक्टेड।
पहले तीन - फोरनेम, सरनेम, और बैलेंस - हमारी पेरेंट क्लास के मानों के समान हैं लेकिन रिस्ट्रिक्टेड नया है, और यह हमारी चाइल्ड क्लास के लिए अनन्य है। डिफ़ॉल्ट रूप से, रिस्ट्रिक्टेड को True पर सेट किया जाता है।
इसलिए यदि हम एक मानक BankAccount बनाते हैं (कोई ChildBankAccount नहीं), तो हम रिस्ट्रिक्टेड मान तक पहुंच नहीं पाएंगे। इसी तरह, हम isRestricted विधि तक तब तक नहीं पहुंच पाएंगे जब तक हम ChildBankAccount नहीं बनाते।
चाइल्ड क्लास का उदाहरण
यहां ChildBankAccount बनाने और getBalance() और isRestricted() विधियों का उपयोग करके हमारी क्लास के बारे में अधिक जानने का एक उदाहरण है:
child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())
print(child_account.isRestricted())
हमारा कोड निम्नलिखित लौटाता है:
Balance: $ 100 This account is restricted as the user is under 18.
जैसा कि आप देख सकते हैं, हमारा प्रोग्राम पहले Bill Appleseed के लिए एक नया ChildBankAccount परिभाषित करता है, जिसके खाते में $100 हैं। फिर, हमारा प्रोग्राम हमारी क्लास में getBalance() विधि को निष्पादित करता है, जो उपयोगकर्ता की शेष राशि लौटाती है। getBalance() हमारी पेरेंट क्लास, BankAccount में घोषित है, लेकिन इनहेरिटेंस के माध्यम से ChildBankAccount के लिए एक्सेसिबल है।
हमारा प्रोग्राम isRestricted() विधि को भी निष्पादित करता है, जिसमें कहा गया है कि चाइल्ड का खाता प्रतिबंधित है क्योंकि वे 18 वर्ष से कम उम्र के हैं। यह क्लास ChildBankAccount में घोषित है, जिसका अर्थ है कि यह हमारी पेरेंट क्लास BankAccount के लिए एक्सेसिबल नहीं है। यदि हम एक प्रतिबंधित BankAccount बनाना चाहते हैं, तो हमें पेरेंट क्लास को बदलना होगा।
पेरेंट विधियों को पुनः परिभाषित करना
ऊपर के हमारे उदाहरण में, हमने BankAccount नामक एक पेरेंट क्लास घोषित की जो बैंक खातों के लिए जानकारी संग्रहीत करती है। हमने ChildBankAccount नामक एक चाइल्ड क्लास भी बनाई जो 18 वर्ष से कम उम्र के खाताधारकों के लिए जानकारी संग्रहीत करती है। इस क्लास ने BankAccount क्लास से विधियों को प्राप्त किया और isRestricted() विधि भी बनाई।
लेकिन क्या होगा यदि हम एक मौजूदा पेरेंट क्लास विधि को संशोधित करना चाहते हैं? मान लें कि हम चाहते हैं कि हमारा BankAccount बैलेंस एक संदेश के साथ अपनी शेष राशि लौटाए जिसमें You are eligible for an overdraft लिखा हो, लेकिन हम नहीं चाहते कि यह ChildBankAccount धारकों के लिए दिखाई दे।
इसे करने के लिए, हमें अपनी पेरेंट विधि को ओवरराइड करना होगा।
पेरेंट विधि को ओवरराइड करना
यहां हमारे संशोधित पेरेंट विधि, BankAccount का कोड है, जो अब खाताधारकों को एक संदेश प्रिंट करता है जिसमें कहा जाता है कि जब वे अपना बैलेंस चेक करते हैं तो वे ओवरड्राफ्ट के लिए पात्र हैं:
class BankAccount:
def __init__(self, forename, surname, balance):
self.forename = forename
self.surname = surname
self.balance = balance
def getDetails(self):
print("Forename: ", self.forename)
print("Surname: ", self.surname)
def getBalance(self):
print("Balance: $ ", self.balance)
print("You are eligible for an overdraft.")
अब, यदि हम John Appleseed के लिए एक नया BankAccount बनाते हैं और उसका बैलेंस प्रिंट करते हैं, तो हमें You are eligible for an overdraft बताने वाला एक संदेश दिखाई देगा। यहां एक नया खाता घोषित करने और उसका बैलेंस चेक करने का एक उदाहरण है:
account = BankAccount("John", "Appleseed", 100)
print(account.getBalance())
हमारा कोड निम्नलिखित लौटाता है:
Balance: $ 100 You are eligible for an overdraft.
लेकिन इस परिवर्तन का अर्थ यह भी है कि हमारा ChildBankAccount, जो BankAccount से अपने मान प्राप्त करता है, वह भी संदेश देखेगा। यहां ChildBankAccount बनाने और उसका बैलेंस चेक करने का एक उदाहरण है अब जब हमारा BankAccount पेरेंट क्लास बदल गया है:
child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())
हमारा कोड लौटाता है:
Balance: $ 100 You are eligible for an overdraft.
चूंकि बच्चों को आमतौर पर ओवरड्राफ्ट की अनुमति नहीं होती है, हमें अपने कोड में बदलाव करना होगा। अब, ऐसा करने के लिए, हमें अपनी ChildBankAccount क्लास को संशोधित करना होगा और एक नया getBalance() फ़ंक्शन घोषित करना होगा।
यहां ऊपर से हमारे ChildBankAccount का कोड है:
class ChildBankAccount(BankAccount):
def __init__(self, forename, surname, balance, restricted=True):
self.forename = forename
self.surname = surname
self.balance = balance
self.restricted = restricted
def isRestricted(self):
print("This account is restricted as the user is under 18.")
हमें इस कोड को एक नया फ़ंक्शन जोड़कर बदलने की आवश्यकता है: getBalance()। यह फ़ंक्शन उसी तरह काम करेगा जैसा हमने अपनी पेरेंट क्लास में घोषित किया था, लेकिन इसमें ओवरड्राफ्ट के बारे में संदेश शामिल नहीं होगा। यहां वह कोड है जिसे हम अपने नए फ़ंक्शन को घोषित करने के लिए जोड़ेंगे:
...
def getBalance(self):
print("Balance: $ ", self.balance)
आइए अब अपने चाइल्ड का बैलेंस पुनः प्राप्त करने का प्रयास करते हैं:
child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())
हमारा कोड निम्नलिखित लौटाता है:
Balance: $ 100
उपरोक्त उदाहरण में, हमने ChildBankAccount चाइल्ड क्लास में getBalance() विधि को ओवरराइड किया है। ChildBankAccount के लिए हमारा नया getBalance() विधि केवल उपयोगकर्ता की शेष राशि दिखाता है। लेकिन हमारी BankAccount क्लास में, getBalance() विधि उपयोगकर्ता की शेष राशि और संदेश You are eligible for an overdraft दोनों दिखाती है।
पेरेंट विधियों को ओवरराइड करना तब उपयोगी हो सकता है जब आपके पास कई चाइल्ड विधियां हों जो अपनी पेरेंट के समान विधियों का उपयोग कर सकती हैं, लेकिन उन्हें अपने विशिष्ट परिवर्तनों की आवश्यकता होती है। ऊपर के मामले की तरह, हम चाहते हैं कि हमारे पेरेंट बैंक खाते ओवरड्राफ्ट संदेश देखें, लेकिन हमारे चाइल्ड बैंक खाते नहीं, इसलिए हमने ChildBankAccount में अपनी पेरेंट विधि को ओवरराइड किया।
निष्कर्ष
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में इनहेरिटेंस का उपयोग आपको सबक्लास बनाने में मदद करने के लिए किया जाता है जो पेरेंट क्लास में पहले से घोषित मानों को संग्रहीत कर सकते हैं। यह तब उपयोगी होता है जब आप समान क्लास बना रहे हों जो समान मान संग्रहीत करेंगे क्योंकि आप उन क्लास को बनाने के लिए इनहेरिटेंस का उपयोग कर सकते हैं बिना अपना कोड कई बार दोहराए।
इस ट्यूटोरियल में, हमने पायथन में इनहेरिटेंस की भूमिका का पता लगाया। हमने यह भी चर्चा की कि इनहेरिटेंस और पेरेंट और चाइल्ड क्लास कैसे काम करते हैं, फिर हमने पेरेंट विधियों को ओवरराइड करने का तरीका देखा। अब आप क्लास और इनहेरिटेंस के साथ एक पायथन विशेषज्ञ की तरह काम करने के लिए तैयार हैं!