Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन इनहेरिटेंस:एक चरण-दर-चरण मार्गदर्शिका

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


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

उदाहरण के लिए, आपके पास एक वर्ग हो सकता है जो "बैंक खातों" को संग्रहीत करता है, और एक उपवर्ग बनाना चाहता है जो "गोल्ड बैंक खाते" संग्रहीत करता है जो मौजूदा वर्ग "बैंक खातों" में विशेषताओं का संदर्भ दे सकता है।

इस ट्यूटोरियल में, हम पायथन में इनहेरिटेंस की मूल बातें तोड़ने जा रहे हैं। हम इस बात पर भी चर्चा करने जा रहे हैं कि माता-पिता और बच्चे की पायथन कक्षाएं कैसे काम करती हैं, और जब आप कक्षाओं की वस्तुओं के साथ काम कर रहे हों तो विशेषताओं और विधियों को कैसे ओवरराइड करें।

पायथन वंशानुक्रम

वंशानुक्रम एक शब्द है जिसका उपयोग किसी अन्य वर्ग के भीतर पायथन वर्ग का वर्णन करने के लिए किया जाता है। subclasses नामक वर्ग या child classes parent classes . से मान इनहेरिट कर सकते हैं , ठीक उसी तरह जैसे वास्तविक दुनिया में बच्चों को अपने माता-पिता से गुण विरासत में मिलते हैं।

वंशानुक्रम उपयोगी है क्योंकि यह हमें subclasses बनाने की अनुमति देता है जिनके पास मूल वर्ग के समान मूल्य प्रकार हैं, उन प्रकारों को कई बार घोषित किए बिना।

अभिभावक वर्ग

अभिभावक वर्ग (जिसे base classes भी कहा जाता है) एक मास्टर संरचना बनाएं जो उपवर्गों तक पहुंच सके। हम सामान्य मूल्यों के एक ही सेट को फिर से घोषित किए बिना कई उपवर्ग बना सकते हैं जो मूल वर्ग से व्युत्पन्न वर्ग विधियाँ हैं।

आइए एक उदाहरण का उपयोग करके यह स्पष्ट करें कि यह क्रिया में कैसे काम करेगा। मान लें कि हमारे पास एक प्रोग्राम है जो दो अलग-अलग बैंक खाता प्रकारों के साथ काम करता है:माता-पिता और बच्चे।

81% प्रतिभागियों ने कहा कि बूटकैंप में भाग लेने के बाद उन्हें अपनी तकनीकी नौकरी की संभावनाओं के बारे में अधिक आत्मविश्वास महसूस हुआ। आज ही एक बूटकैंप से मिलान करें।

बूटकैंप शुरू करने से लेकर अपनी पहली नौकरी खोजने तक, औसत बूटकैंप ग्रेड ने करियर संक्रमण में छह महीने से भी कम समय बिताया।

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

इसलिए, यदि हम इन मूल्यों के साथ एक कार्यक्रम बनाना चाहते हैं, तो हम पहले अपने बैंक खाते (एक अभिभावक वर्ग) के लिए एक वर्ग को परिभाषित करेंगे, फिर दो प्रकार के बैंक खातों के लिए चाइल्ड क्लास बनाएंगे- माता-पिता और बच्चे- जिनका हम समर्थन करना चाहते हैं।

बैंक खाते के लिए अभिभावक वर्ग घोषित करने का एक उदाहरण यहां दिया गया है:

क्लास बैंकखाता:def __init__(स्वयं, पूर्वनाम, उपनाम, शेष राशि):स्वयं का नाम =स्वयं का उपनाम =स्वयं का उपनाम =उपनाम स्वयं। शेष राशि =शेष राशि

हमने BankAccount class वर्ग बनाया है जो तीन मूल्यों को संग्रहीत करता है:पूर्वनाम, उपनाम और संतुलन। हम अपनी कक्षा में विधियाँ भी जोड़ सकते हैं, जैसे:

<पूर्व>वर्ग बैंकखाता:def __init__(स्वयं, पूर्वनाम, उपनाम, शेष राशि):स्वयं का नाम =स्वयं का उपनाम =उपनाम स्वयं। शेष राशि =शेष राशि प्राप्त विवरण (स्वयं):प्रिंट ("फोरनाम:", स्वयं। उपनाम) प्रिंट ("उपनाम:", self.surname) def getBalance(self):प्रिंट ("बैलेंस:$", सेल्फ.बैलेंस)

हमारी कक्षा अब तीन मूल्यों के साथ-साथ दो नई विधियों को संग्रहीत करती है:विवरण और संतुलन। details हमारे खाताधारक के उपनाम और उपनाम, और balance . का पता लगाने के लिए इस पद्धति का उपयोग किया जा सकता है विधि खाताधारक की शेष राशि वापस कर देगी।

प्रत्येक विधि और चर जो हम अपने BankAccount . में घोषित करते हैं क्लास हमारे चाइल्ड क्लास में उपलब्ध होगी।

हमारे वर्ग की कार्रवाई को स्पष्ट करने के लिए, आइए एक उदाहरण बैंक खाता बनाएं। हम निम्नलिखित कोड का उपयोग करके ऐसा कर सकते हैं:

खाता =BankAccount("जॉन", "Appleseed", 100)

यह John Appleseed के लिए एक खाता बनाएगा जिसमें $100 है। अब जब हमारा खाता तैयार हो गया है, तो हम इसका संदर्भ देना शुरू कर सकते हैं जैसे हम किसी अन्य वर्ग के साथ करेंगे। getBalance() . चलाने का एक उदाहरण यहां दिया गया है हमारे पास कितना पैसा है, इसका पता लगाने के लिए हमारे बैंक खाते में विधि:

प्रिंट करें(account.getBalance())

हमारा कार्यक्रम निम्नलिखित लौटाता है:

शेष राशि:$100

बाल वर्ग

उपरोक्त उदाहरण में, हमने एक मूल वर्ग घोषित किया है जो बैंक खातों को संग्रहीत करता है। लेकिन क्या होगा यदि हम किसी विशेष प्रकार के खाते के बारे में जानकारी संग्रहीत करना चाहते हैं जैसे कि 18 वर्ष से कम आयु के बच्चे के खाते? यहीं से बच्चों की कक्षाएं आती हैं।

बाल वर्ग, या उपवर्ग, मूल वर्ग से मूल्यों को प्राप्त करते हैं। इसका मतलब यह है कि प्रत्येक चाइल्ड क्लास हमारे द्वारा अपने पैरेंट क्लास में घोषित तरीकों और वेरिएबल्स को संदर्भित करने में सक्षम होगा।

तो, मान लें कि हम ChildBankAccount के लिए चाइल्ड क्लास बनाना चाहते हैं . यह खाता उपयोगकर्ता के बैंक खाते की जानकारी—उनका नाम और शेष—वापसी करने में सक्षम होना चाहिए और इसमें restricted नामक एक नया मान भी होना चाहिए . यह मान बच्चे के खाते में संग्रहीत किया जाएगा क्योंकि वे 18 वर्ष से कम आयु के हैं, और एक पूर्ण बैंक खाते के लिए योग्य नहीं हैं।

चाइल्ड क्लास बनाने के लिए, हम निम्नलिखित कोड का उपयोग कर सकते हैं:

क्लास चाइल्डबैंकखाता(बैंकखाता):

ChildBankAccount क्लास BankAccount . का बच्चा बन जाता है क्लास क्योंकि BankAccount कोष्ठक में संलग्न है। अगर हम चाहते हैं कि हमारे चाइल्ड क्लास का मान हमारे मूल वर्ग के समान हो—BankAccount —हम pass का उपयोग कर सकते हैं इस तरह कीवर्ड:

क्लास चाइल्डबैंकअकाउंट (बैंकअकाउंट):पास

लेकिन जैसा कि हमने पहले चर्चा की थी, हमारे चाइल्ड खाते को एक विशेष मान स्टोर करने की आवश्यकता होगी:एक वैरिएबल जो कहता है कि उपयोगकर्ता का खाता प्रतिबंधित है।

इस लक्ष्य को पूरा करने के लिए, हम restricted . नामक एक नया मान जोड़ने जा रहे हैं हमारे बाल वर्ग के लिए। हम निम्नलिखित कोड का उपयोग करके ऐसा कर सकते हैं:

 क्लास चाइल्डबैंक अकाउंट (बैंक अकाउंट):def __init__ (स्वयं, अग्रनाम, उपनाम, शेष, प्रतिबंधित =सत्य):स्वयं। अग्रनाम =forenameself.surname =उपनाम स्वयं। शेष राशि =शेष राशि। प्रतिबंधित =प्रतिबंधित def isRestricted (स्वयं):प्रिंट ( "यह खाता प्रतिबंधित है क्योंकि उपयोगकर्ता की आयु 18 वर्ष से कम है।")

अब, हमारे कोड को तोड़ते हैं।

उपरोक्त कोड में, हम कहते हैं कि हम चाहते हैं कि हमारे चाइल्डबैंक अकाउंट्स में चार मान हों:फोरनेम, सरनेम, बैलेंस और प्रतिबंधित।

पहले तीन—पूर्वनाम, उपनाम, और शेष—हमारे मूल वर्ग मूल्यों के समान हैं लेकिन restricted नया है, और यह हमारे बाल वर्ग के लिए विशिष्ट है। डिफ़ॉल्ट रूप से, restricted True . पर सेट है ।

इसलिए यदि हम एक मानक BankAccount बनाते हैं (ChildBankAccount ), हम restricted . तक नहीं पहुंच पाएंगे मूल्य। इसी तरह, हम isRestricted . तक नहीं पहुंच पाएंगे जब तक हम ChildBankAccount नहीं बनाते ।

ChildBankAccount . बनाने का एक उदाहरण यहां दिया गया है और getBalance() . का उपयोग करके और isResticted() हमारी कक्षा के बारे में अधिक जानने के तरीके:

child_account =ChildBankAccount("Bill", "Appleseed", 100) Print(child_account.getBalance())print(child_account.isRestricted ())

हमारा कोड निम्नलिखित लौटाता है:

शेष राशि:$ 100यह खाता प्रतिबंधित है क्योंकि उपयोगकर्ता की आयु 18 वर्ष से कम है।

जैसा कि आप देख सकते हैं, हमारा कार्यक्रम पहले एक नया ChildBankAccount . परिभाषित करता है Bill Appleseed . के लिए , जिनके खाते में $100 है। फिर, हमारा प्रोग्राम getBalance() . को निष्पादित करता है हमारी कक्षा में विधि, जो उपयोगकर्ता की शेष राशि लौटाती है। getBalance() हमारे मूल वर्ग में घोषित किया गया है, BankAccount , लेकिन ChildBankAccount . तक पहुंच योग्य है विरासत . के माध्यम से ।

हमारा प्रोग्राम isRestricted() . को भी निष्पादित करता है विधि, जिसमें कहा गया है कि बच्चे का खाता प्रतिबंधित है क्योंकि वे 18 वर्ष से कम आयु के हैं। इस वर्ग को ChildBankAccount में घोषित किया गया है। , हालांकि, जिसका अर्थ है कि यह हमारे मूल वर्ग BankAccount . तक पहुंच योग्य नहीं है . अगर हम एक प्रतिबंधित BankAccount बनाना चाहते हैं , हमें मूल वर्ग को बदलना होगा।

अभिभावक विधियों को फिर से परिभाषित करना

हमारे उपरोक्त उदाहरण में, हमने BankAccount . नामक एक मूल वर्ग घोषित किया है जो बैंक खातों के लिए जानकारी संग्रहीत करता है। हमने ChildBankAccount . नामक एक चाइल्ड क्लास भी बनाई है जो 18 वर्ष से कम आयु के खाताधारकों के लिए जानकारी संग्रहीत करता है। इस वर्ग को BankAccount से विधियां विरासत में मिली हैं। क्लास और isRestricted() . भी बनाया है विधि।

लेकिन क्या होगा यदि हम मौजूदा मूल वर्ग विधि को संशोधित करना चाहते हैं? मान लें कि हमें अपना BankAccount चाहिए शेष राशि के साथ एक संदेश लौटाने के लिए शेष राशि और You are eligible for an overdraft . बताते हुए एक संदेश , लेकिन हम नहीं चाहते कि यह ChildBankAccount . के लिए प्रदर्शित हो धारक।

ऐसा करने के लिए, हमें अपनी मूल पद्धति को ओवरराइड करना होगा।

यहां हमारी संशोधित मूल पद्धति के लिए कोड है, BankAccount , जो अब खाताधारकों को यह बताने के लिए एक संदेश प्रिंट करता है कि वे अपनी शेष राशि की जांच करते समय ओवरड्राफ्ट के लिए पात्र हैं:

<पूर्व>वर्ग बैंकखाता:def __init__(स्वयं, पूर्वनाम, उपनाम, शेष राशि):स्वयं का नाम =स्वयं का उपनाम =उपनाम स्वयं। शेष राशि =शेष राशि प्राप्त विवरण (स्वयं):प्रिंट ("फोरनाम:", स्वयं। उपनाम) प्रिंट ("उपनाम:", स्व.उपनाम) def getBalance(self):प्रिंट ("बैलेंस:$", सेल्फ़.बैलेंस) प्रिंट ("आप ओवरड्राफ्ट के लिए पात्र हैं।")

अब, यदि हम एक नया BankAccount बनाते हैं John Appleseed . के लिए और उसकी शेष राशि का प्रिंट आउट लें, हमें एक संदेश दिखाई देगा जिसमें लिखा होगा You are eligible for an overdraft . यहां एक नया खाता घोषित करने और उसकी शेष राशि की जांच करने का एक उदाहरण दिया गया है:

अकाउंट =बैंकअकाउंट ("जॉन", "एप्पलसीड", 100)प्रिंट (खाता.getBalance ())

हमारा कोड निम्नलिखित लौटाता है:

शेष राशि:$ 100आप ओवरड्राफ्ट के लिए पात्र हैं।

लेकिन इस बदलाव का मतलब यह भी है कि हमारा ChildBankAccount , जो अपने मूल्यों को BankAccount . से प्राप्त करता है , संदेश भी देखेंगे। ChildBankAccount . बनाने का एक उदाहरण यहां दिया गया है और अब अपना बैलेंस चेक कर रहे हैं कि हमारा BankAccount मूल वर्ग बदल गया है:

child_account =ChildBankAccount("Bill", "Appleseed", 100) Print(child_account.getBalance ())

हमारा कोड लौटाता है:

शेष राशि:$ 100आप ओवरड्राफ्ट के लिए पात्र हैं।

चूंकि आमतौर पर बच्चों को ओवरड्राफ्ट की अनुमति नहीं होती है, इसलिए हमें अपने कोड में बदलाव करने की आवश्यकता होगी। अब, ऐसा करने के लिए, हमें अपने ChildBankAccount . को संशोधित करना होगा क्लास करें और एक नया getBalance() घोषित करें समारोह।

हमारे ChildBankAccount . के लिए यह कोड है ऊपर से:

 क्लास चाइल्डबैंक अकाउंट (बैंक अकाउंट):def __init__ (स्वयं, अग्रनाम, उपनाम, शेष, प्रतिबंधित =सत्य):स्वयं। अग्रनाम =forenameself.surname =उपनाम स्वयं। शेष राशि =शेष राशि। प्रतिबंधित =प्रतिबंधित def isRestricted (स्वयं):प्रिंट ( "यह खाता प्रतिबंधित है क्योंकि उपयोगकर्ता की आयु 18 वर्ष से कम है।")

नया फ़ंक्शन जोड़ने के लिए हमें इस कोड को बदलने की आवश्यकता है:getBalance() . यह फ़ंक्शन उसी तरह काम करेगा जैसा हमने अपने मूल वर्ग में घोषित किया था, लेकिन इसमें ओवरड्राफ्ट के बारे में संदेश शामिल नहीं होगा। यहां वह कोड है जिसे हम अपना नया फ़ंक्शन घोषित करने के लिए जोड़ेंगे:

…def getBalance(self):प्रिंट ("बैलेंस:$", सेल्फ बैलेंस)

आइए अब अपने बच्चे की शेष राशि को पुनः प्राप्त करने का प्रयास करें:

child_account =ChildBankAccount("Bill", "Appleseed", 100) Print(child_account.getBalance ())

हमारा कोड निम्नलिखित लौटाता है:

शेष राशि:$100

उपरोक्त उदाहरण में, हमने getBalance() . को अधिलेखित कर दिया है ChildBankAccount . में विधि बाल वर्ग। हमारा नया getBalance() ChildBankAccount . के लिए विधि केवल उपयोगकर्ता का संतुलन दिखाता है। लेकिन हमारे BankAccount . में वर्ग, getBalance() विधि उपयोगकर्ता की शेष राशि और संदेश दोनों को दिखाती है You are eligible for an overdraft

माता-पिता के तरीकों को ओवरराइड करना तब उपयोगी हो सकता है जब आपके पास कई चाइल्ड विधियाँ हों जो उनके माता-पिता के समान विधियों का उपयोग कर सकती हैं, लेकिन उनके स्वयं के विशिष्ट परिवर्तन करने की आवश्यकता होती है। ऊपर के मामले की तरह, हम चाहते हैं कि हमारे मूल बैंक खाते एक ओवरड्राफ्ट संदेश देखें, लेकिन हमारे चाइल्ड बैंक खाते नहीं, इसलिए हम ChildBankAccount में अपनी मूल पद्धति को ओवरराइड करते हैं ।

निष्कर्ष

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में इनहेरिटेंस का उपयोग आपको उपवर्ग बनाने में मदद करने के लिए किया जाता है जो पहले से ही मूल वर्ग में घोषित मूल्यों को संग्रहीत कर सकते हैं। यह तब उपयोगी होता है जब आप समान वर्ग बना रहे होते हैं जो समान मूल्यों को संग्रहीत करते हैं क्योंकि आप अपने कोड को कई बार दोहराए बिना उन वर्गों को बनाने के लिए विरासत का उपयोग कर सकते हैं।

इस ट्यूटोरियल में, हमने पायथन में इनहेरिटेंस की भूमिका की खोज की। हमने यह भी चर्चा की कि वंशानुक्रम और माता-पिता और बाल वर्ग कैसे काम करते हैं, फिर हमने पता लगाया कि माता-पिता के तरीकों को कैसे ओवरराइड किया जाए। अब आप पायथन विशेषज्ञ की तरह कक्षाओं और विरासत के साथ काम करने के लिए तैयार हैं!


  1. पायथन दुभाषिए:एक चरण-दर-चरण मार्गदर्शिका

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

  1. पायथन में क्लास इनहेरिटेंस

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

  1. पायथन में विरासत

    इस लेख में, हम पायथन 3.x में इनहेरिटेंस और एक्सटेंडिंग क्लासेस सीखेंगे। या पहले। वंशानुक्रम वास्तविक दुनिया के संबंधों का अच्छी तरह से प्रतिनिधित्व करता है, पुन:प्रयोज्य प्रदान करता है और पारगमन का समर्थन करता है। यह तेजी से विकास समय, आसान रखरखाव और विस्तार में आसान प्रदान करता है। वंशानुक्रम को