मुख्य सामग्री पर जाएँ

Python इनहेरिटेंस: रीउसएबल कोड के लिए बेहतरीन प्रथाएँ

Python इनहेरिटेंस आपको मौजूदा क्लासेस की कार्यक्षमता का पुन: उपयोग और विस्तार करके नई क्लासेस बनाने देता है। पेरेंट-चाइल्ड क्लास संबंधों को डिजाइन करना, इनहेरिटेंस पैटर्न इम्प्लीमेंट करना, और मेथड ओवरराइडिंग जैसी तकनीकों को लागू करना सीखें।
· 9 मि॰ पढ़ें

AI के साथ खोजें

मान लीजिए आप एक सॉफ्टवेयर सिस्टम बना रहे हैं जिसमें छात्रों, शिक्षकों और प्रशासकों जैसे कई उपयोगकर्ता भूमिकाएँ हैं। इन भूमिकाओं में नाम और ID जैसे सामान्य attributes होते हैं, लेकिन इन्हें कुछ ऐसी कार्यक्षमताएँ भी चाहिए जो केवल उनके लिए विशिष्ट हों। कोड को दोहराने के बजाय, inheritance आपको एक parent class में साझा व्यवहार परिभाषित करने और उसे विशिष्ट child classes में विस्तारित करने देता है।

इस लेख में हम Python inheritance का अन्वेषण करेंगे, जिसमें मूलभूत से लेकर उन्नत अवधारणाएँ शामिल होंगी, जैसे method overriding और super() फ़ंक्शन। यह एक built-in फ़ंक्शन है जो superclass का एक अस्थायी ऑब्जेक्ट लौटाता है, ताकि आप उसके methods तक पहुँच सकें बिना parent class का नाम स्पष्ट रूप से बताए। यदि अभी यह स्पष्ट नहीं है, तो चिंता न करें—हम इसे नीचे विस्तार से समझेंगे।

Python में Inheritance की मूल बातें

Inheritance, object-oriented programming (OOP) के बुनियादी स्तंभों में से एक है, जो एक क्लास (जिसे child class कहा जाता है) को दूसरी क्लास (जिसे parent class कहा जाता है) से attributes और methods प्राप्त करने की अनुमति देता है। यह सुविधा code reuse का केंद्र है और maintenance को सरल बनाती है, जिससे स्केलेबल और कुशल प्रोग्राम बनाना आसान हो जाता है।

Parent और Child क्लास परिभाषित करना

आगे बढ़ने से पहले, parent और child क्लास के बीच के संबंध को समझते हैं।

Parent class

आइए parent क्लास से शुरू करें। Parent क्लास वह आधार (base) क्लास है जिससे child क्लासेज़ व्युत्पन्न होती हैं। यह साझा attributes और methods को समाहित करती है।

Python में parent क्लास को इस प्रकार परिभाषित किया जाता है:

class ParentClass:
    def __init__(self, attributes):
        # Initialize attributes
        pass

    def method(self):
        # Define behavior
        pass

Child class 

एक child class parent क्लास से attributes और methods को विरासत में लेती है। इससे वह parent क्लास में परिभाषित कार्यक्षमता का उपयोग कर सकती है। निम्नलिखित कोड दर्शाता है कि child क्लास किस प्रकार parent क्लास से attributes और methods इनहेरिट करती है:

class ChildClass(ParentClass):
    def additional_method(self):
        # Define new behavior
        pass

यह सरल सिंटैक्स child क्लास को parent क्लास में परिभाषित कार्यक्षमता का उपयोग करने और उसे विस्तार देने की अनुमति देता है।

Parent और Child क्लास बनाना

एक व्यावहारिक उदाहरण बनाते हैं, जहाँ Person parent क्लास है और Student child क्लास है।

Parent क्लास बनाना

Person क्लास में साझा attributes और जानकारी प्रदर्शित करने की एक method शामिल है:    

# Defining the Parent Class
class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id
    def display_info(self):
        return f"Name: {self.name}, ID: {self.id}"

Child क्लास बनाना

Student क्लास, Person से इनहेरिट करती है और एक नई method study जोड़ती है।

# Defining the Child Class
class Student(Person):
    def study(self):
        return f"{self.name} is studying."

आइए parent और child क्लास का परीक्षण करें।

# Creating and Testing Instances
student = Student("Samuel", 102)
print(student.display_info())  
print(student.study())      
Name: Samuel, ID: 102
Samuel is studying.

यहाँ क्या हो रहा है:

  1. Student क्लास, Person की __init__ method का उपयोग करके name और id इनिशियलाइज़ करती है।

  2. study method, Student क्लास के लिए विशिष्ट है और इसकी कार्यक्षमता बढ़ाती है।

  3. display_info method सीधे Person से इनहेरिट होती है।

Python में Inheritance के प्रकार

Python में inheritance से क्लासेज़ दूसरी क्लासेज़ से attributes और व्यवहार (behaviors) इनहेरिट कर सकती हैं, जैसा कि हमने पहले चर्चा की, जिससे code reuse और साफ-सुथरा डिज़ाइन बढ़ता है। इस खंड में, हम Python inheritance के विभिन्न प्रकारों पर बात करेंगे, जिनमें single, multiple, hierarchical और hybrid inheritance अलग-अलग श्रेणियों के रूप में शामिल हैं।

Single inheritance

Single inheritance तब होता है जब कोई child क्लास एक ही parent क्लास से इनहेरिट करती है और parent की कार्यक्षमता को बढ़ाती है। यह तब उपयोगी होता है जब किसी ऑब्जेक्ट प्रकार में व्यापक श्रेणी के साथ सामान्य गुण होते हैं, लेकिन उसे अतिरिक्त attributes या व्यवहार की भी आवश्यकता होती है।

पहले लिया गया उदाहरण single inheritance था, लेकिन अब इसे थोड़ा और करीब से देखें: एक स्कूल प्रबंधन प्रणाली में, सभी व्यक्तियों, जैसे छात्र, शिक्षक और स्टाफ के पास name और ID जैसी कुछ सामान्य जानकारियाँ होती हैं। हालांकि, छात्रों के पास ग्रेड्स और नामांकित पाठ्यक्रम जैसे शैक्षणिक रेकॉर्ड भी होते हैं। Single inheritance का उपयोग करके, हम साझा attributes के लिए एक Person क्लास बना सकते हैं और इसे Student क्लास के साथ शैक्षणिक विवरण जोड़कर विस्तृत कर सकते हैं।

single inheritance

Single inheritance. छवि: लेखक द्वारा

उपरोक्त परिदृश्य का एक अच्छा उदाहरण यहाँ है:

class Person:
    """Represents a general person with basic details."""
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}"

class Student(Person):
    """Represents a student, extending the Person class to include academic details."""
    def __init__(self, name, id, grade, courses):
        super().__init__(name, id)
        self.grade = grade
        self.courses = courses

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}, Courses: {', '.join(self.courses)}"

# Example usage in a school system
student = Student("Samuel", 5678, "B+", ["Math", "Physics", "Computer Science"])
print(student.get_details())
Name: Samuel, ID: 5678, Grade: B+, Courses: Math, Physics, Computer Science

यहाँ Student क्लास, Person से get_details() method को इनहेरिट करती है, लेकिन उसे grade और courses शामिल करने के लिए विस्तृत करती है। यह दर्शाता है कि single inheritance कैसे मॉड्यूलर कोड को बढ़ावा देता है।

Multiple inheritance

Multiple inheritance, एक तरह से परिवार वृक्ष जैसा, किसी child क्लास को एक से अधिक parent क्लास से इनहेरिट करने देता है, और प्रत्येक से attributes तथा behaviors को जोड़ता है। इससे टकराव की संभावना बन सकती है, जिसे Python method resolution order (MRO) के माध्यम से सुलझाता है।

multiple inheritance

Multiple inheritance. छवि: लेखक द्वारा

देखें:

class Person:
    def get_details(self):
        return "Details of a person."

class Athlete:
    def get_skill(self):
        return "Athletic skills."

class Student(Person, Athlete):
    pass

# Example usage
student = Student()
print(student.get_details())
print(student.get_skill())
Details of a person.
Athletic skills.

हम देखते हैं कि Student क्लास ने Person और Athlete, दोनों से attributes और methods इनहेरिट किए। बिना किसी अतिरिक्त प्रयास के, Student क्लास को Person parent क्लास की get_details() method और Athlete parent क्लास की get_skill() method तक पहुँच मिल जाती है। हम प्रभावी रूप से कई स्रोतों की कार्यक्षमता को जोड़ रहे हैं।

हालाँकि, कई क्लास से इनहेरिट करना टकराव पैदा कर सकता है। यदि दोनों parent क्लासेज़ ने एक ही नाम की method या attribute परिभाषित की हो तो क्या होगा? मैंने पहले method resolution order का उल्लेख किया था, अब उसके बारे में थोड़ा और कहते हैं। Method resolution order यह निर्धारित करता है कि methods और attributes के लिए क्लासेज़ को किस क्रम में खोजा जाएगा। MRO depth-first, left-to-right क्रम का पालन करता है।

किसी क्लास का MRO आप __mro__ attribute या mro() method के माध्यम से देख सकते हैं:

print(Student.__mro__)
(<class '__main__.Student'>, <class '__main__.Person'>, <class '__main__.Athlete'>, <class 'object'>)

Multilevel, hierarchical, और hybrid inheritance

Python जटिल inheritance संरचनाओं का भी समर्थन करता है। इन्हें हम इसी उदाहरण के ज़रिए समझेंगे।

Multilevel inheritance

Multilevel inheritance तब होता है जब कोई child क्लास किसी अन्य child क्लास से इनहेरिट करती है, और वह child क्लास किसी parent क्लास से इनहेरिट करती है। यह इनहेरिटेंस की एक शृंखला बनाता है।

multilevel inheritance

Multilevel inheritance. छवि: लेखक द्वारा

एक अच्छा उदाहरण:

class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}"

class Student(Person):
    def __init__(self, name, id, grade):
        super().__init__(name, id)
        self.grade = grade

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}"

class GraduateStudent(Student):
    def __init__(self, name, id, grade, thesis_title):
        super().__init__(name, id, grade)
        self.thesis_title = thesis_title

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}, Thesis: {self.thesis_title}"

# Example usage
grad_student = GraduateStudent("Charlie", 91011, "A", "AI in Healthcare")
print(grad_student.get_details())
Name: Charlie, ID: 91011, Grade: A, Thesis: AI in Healthcare

यहाँ, शृंखला में हर क्लास कुछ नया जोड़ती है: Person नाम और ID संभालता है, Student में grade शामिल है, और GraduateStudent थीसिस जोड़ता है। super().__init__() की बदौलत हम initialization लॉजिक को दोहराए बिना पुन: उपयोग करते हैं। यह कुशल, सुव्यवस्थित है और सुनिश्चित करता है कि “inheritance की सीढ़ी” का हर पायदान, जैसा मैं सोचता हूँ, ठीक से काम करे।

Hierarchical inheritance

Hierarchical inheritance में, कई child क्लासेज़ एक ही parent क्लास से इनहेरिट करती हैं, जिससे उपक्लासों में साझा व्यवहार के साथ उनकी विशिष्ट विशेषताएँ भी बनी रहती हैं।

hierarchical inheritance

Hierarchical inheritance. छवि: लेखक द्वारा

आइए एक अच्छा उदाहरण देखते हैं:

class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}"

class Student(Person):
    def __init__(self, name, id, grade):
        super().__init__(name, id)
        self.grade = grade

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}"

class Teacher(Person):
    def __init__(self, name, id, subject):
        super().__init__(name, id)
        self.subject = subject

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Subject: {self.subject}"

# Example usage
student = Student("Samuel", 5678, "B+")
teacher = Teacher("Dr. Smith", 1234, "Math")
print(student.get_details())  
print(teacher.get_details())
Name: Samuel, ID: 5678, Grade: B+
Dr. Smith, ID: 1234, Subject: Math

यहाँ Person क्लास आधार के रूप में काम करता है, जो सामान्य attributes और methods (name, id, और get_details) प्रदान करता है। Student और Teacher क्लासेज़ अपनी-अपनी विशिष्ट properties (grade और subject) जोड़कर और get_details method को अपने सन्दर्भ के अनुरूप अनुकूलित करके इस कार्यक्षमता का विस्तार करती हैं।

इस दृष्टिकोण में, साझा कार्यक्षमता एक ही जगह (Person क्लास) में रहती है, जबकि विशिष्ट व्यवहार उपक्लासों में सुसंगठित रूप से समाहित रहता है।

Hybrid inheritance

Hybrid inheritance, multilevel या multiple inheritance जैसे कई प्रकारों को मिलाकर अधिक जटिल संबंधों का मॉडल बनाता है।

hybrid inheritance

Hybrid inheritance. छवि: लेखक द्वारा

आइए एक उदाहरण देखते हैं जो hybrid inheritance की जटिलता को दर्शाता है।

# Base class
class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}"

# Intermediate class inheriting from the base class
class Employee(Person):
    def __init__(self, name, id, position):
        super().__init__(name, id)
        self.position = position

    def get_position(self):
        return f"Position: {self.position}"

# Another independent base class
class Athlete:
    def __init__(self, sport):
        self.sport = sport

    def get_sport(self):
        return f"Sport: {self.sport}"

# Derived class combining Employee and Athlete
class Student(Employee, Athlete):
    def __init__(self, name, id, position, grade, sport):
        Employee.__init__(self, name, id, position)
        Athlete.__init__(self, sport)
        self.grade = grade

    def get_grade(self):
        return f"Grade: {self.grade}"

# Example usage
student = Student("Samuel", 1234, "Intern", "A", "Soccer")
print(student.get_details())  # From Person
print(student.get_position())  # From Employee
print(student.get_grade())  # From Student
print(student.get_sport())  # From Athlete
Name: Samuel, ID: 1234
Position: Intern
Grade: A
Sport: Soccer

इस उदाहरण में Student क्लास hybrid inheritance प्रदर्शित करती है, क्योंकि यह Employee (जो स्वयं Person से इनहेरिट करता है) और Athlete दोनों से attributes और methods इनहेरिट करती है। यह hierarchical inheritance (जहाँ Employee, Person से इनहेरिट करता है) और multiple inheritance (जहाँ Student, Employee और Athlete दोनों से इनहेरिट करता है) को जोड़ती है।

Python में Inheritance के लाभ

अब, इसके strengths और weaknesses देखते हैं: 

Inheritance के लाभ

  1. Reusability: Inheritance के साथ आप parent क्लास में कोड एक बार लिखकर child क्लासेज़ में पुन: उपयोग कर सकते हैं। हमारे उदाहरण में, FullTimeEmployee और Contractor, दोनों Employee parent क्लास से get_details() method इनहेरिट कर सकते हैं।

  2. Simplicity: Inheritance रिश्तों को स्पष्ट रूप से मॉडल करता है। एक अच्छा उदाहरण FullTimeEmployee क्लास है, जो Employee parent क्लास का “is-a” प्रकार है।

  3. Scalability: यह नई सुविधाएँ या child क्लासेज़ जोड़ने में भी मदद करता है, बिना मौजूदा कोड को प्रभावित किए। उदाहरण के लिए, हम आसानी से एक नया Intern क्लास child क्लास के रूप में जोड़ सकते हैं।

Inheritance की संभावित सीमाएँ

  1. Complexity: यह चौंकाने वाला नहीं होगा, लेकिन इनहेरिटेंस के बहुत अधिक स्तर कोड को समझना कठिन बना सकते हैं। उदाहरण के लिए, यदि Employee की बहुत सी child क्लासेज़ हों, जैसे Manager, Engineer, Intern आदि, तो यह भ्रमित कर सकता है।

  2. Dependency: Parent क्लास में बदलाव अनजाने में सभी subclasses को प्रभावित कर सकते हैं। उदाहरण के लिए, यदि आप Employee में संशोधन करते हैं, तो यह FullTimeEmployee या Contractor को बिगाड़ सकता है।

  3. Misuse: जब inheritance उपयुक्त न हो, तब उसका उपयोग डिज़ाइन को जटिल बना सकता है। आप सिर्फ move() को reuse करने के लिए ऐसा समाधान नहीं बनाना चाहेंगे जिसमें Car, Boat से इनहेरिट करे। यह संबंध तार्किक नहीं है।

Advanced Python Inheritance Techniques

अब जब हमने inheritance की बुनियादी बातें देख ली हैं, तो कुछ उन्नत तकनीकों पर नज़र डालते हैं। ये तकनीकें, जैसे method overriding, super(), abstract base classes, और polymorphism, कोड की लचीलेपन को बढ़ाती हैं और अधिक परिष्कृत डिज़ाइन पैटर्न की अनुमति देती हैं। 

Python में methods को override करना

Method overriding, किसी child क्लास को अपने parent क्लास में पहले से परिभाषित किसी method के लिए विशिष्ट कार्यान्वयन प्रदान करने की अनुमति देता है। यह तब उपयोगी होता है जब इनहेरिट किया गया व्यवहार child क्लास की आवश्यकताओं को पूरी तरह पूरा नहीं करता।

class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id
    
    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}"

class Student(Person):
    def __init__(self, name, id, grade):
        super().__init__(name, id)
        self.grade = grade
    
    # Overriding the get_details method
    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}"

# Example usage
student = Student("Samuel", 1234, "A")
print(student.get_details())
Name: Samuel, ID: 1234, Grade: A

यहाँ Student क्लास, Person क्लास की get_details() method को override करके अपना विशिष्ट कार्यान्वयन देती है। इससे child क्लास, उसी method नाम का पालन करते हुए अपना व्यवहार परिभाषित कर सकती है।

तो हम ओवरराइड क्यों करते हैं? हम ओवरराइड इसलिए करते हैं क्योंकि हम विरासत में मिले व्यवहार को कस्टमाइज़ करना चाहते हैं और साथ ही पैरेंट मेथड की कार्यक्षमता को चाइल्ड क्लास की विशिष्ट आवश्यकताओं के अनुसार ढालना चाहते हैं।

पैरेंट इनिशियलाइज़ेशन के लिए super() का उपयोग

super() फ़ंक्शन का उपयोग चाइल्ड क्लास से पैरेंट क्लास के मेथड्स को कॉल करने के लिए किया जाता है। यह तब विशेष रूप से उपयोगी होता है जब आप पैरेंट क्लास के किसी मेथड, जैसे कि __Init__() कंस्ट्रक्टर मेथड, की कार्यक्षमता को बढ़ाना या संशोधित करना चाहते हैं।

तो हम super() फ़ंक्शन का उपयोग क्यों करते हैं? हम super फ़ंक्शन का उपयोग इसलिए करते हैं ताकि हम पैरेंट क्लास के कंस्ट्रक्टर को कॉल और इनिशियलाइज़ कर सकें और इसलिए भी कि हम पैरेंट क्लास का नाम स्पष्ट रूप से लिखने से बच सकें। यह खासकर मल्टिपल इनहेरिटेंस के मामलों में मददगार होता है।

class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

class Student(Person):
    def __init__(self, name, id, grade):
        # Using super() to initialize the parent class
        super().__init__(name, id)
        self.grade = grade

# Example usage
student = Student("Samuel", 5678, "B+")
print(student.name)
print(student.id)
print(student.grade)
Samuel
5678
B+

यहाँ Student क्लास super().__init__(name, id) का उपयोग करके पैरेंट क्लास Person के __init__ मेथड को कॉल करती है, इसलिए name और id एट्रिब्यूट्स को इनिशियलाइज़ करने के लिए कोड दोहराने की ज़रूरत नहीं पड़ती। इसके बाद चाइल्ड क्लास एक grade एट्रिब्यूट जोड़ती है, जो Student क्लास के लिए विशेष है।

एब्सट्रैक्ट बेस क्लासेस (ABCs)

एब्सट्रैक्ट बेस क्लास (ABC) ऐसी क्लास होती है जिससे सीधे ऑब्जेक्ट नहीं बनाए जा सकते। इसका उद्देश्य उन सामान्य मेथड्स का सेट परिभाषित करना है जिन्हें अन्य क्लासेस को इम्प्लीमेंट करना चाहिए। इसलिए ABCs तब उपयोगी होते हैं जब आप सुनिश्चित करना चाहते हैं कि कुछ निश्चित मेथड्स हमेशा चाइल्ड क्लासेस में मौजूद हों।

from abc import ABC, abstractmethod

class Person(ABC):
    @abstractmethod
    def get_details(self):
        pass

class Student(Person):
    def __init__(self, name, id, grade):
        self.name = name
        self.id = id
        self.grade = grade
    
    def get_details(self):
        return f"Name: {self.name}, ID: {self.id}, Grade: {self.grade}"

# Example usage
student = Student("Hamilton", 7890, "A-")
print(student.get_details())
Name: Hamilton, ID: 7890, Grade: A-

यहाँ Person क्लास एक एब्सट्रैक्ट क्लास है जो किसी भी चाइल्ड क्लास से get_details() मेथड को इम्प्लीमेंट करने की अपेक्षा करती है। यह मेथड आगे चाइल्ड क्लास Student द्वारा इम्प्लीमेंट किया गया है।

पॉलीमॉर्फ़िज़्म

पॉलीमॉर्फ़िज़्म का अर्थ है अनेक रूप। Python में, यह अलग-अलग क्लासेस को एक ही मेथड नाम का उपयोग करने देता है, लेकिन हर क्लास उस मेथड को अलग तरीके से इम्प्लीमेंट कर सकती है।

पॉलीमॉर्फ़िज़्म हमें ऐसा कोड लिखने में मदद करता है जो अलग-अलग क्लासेस के ऑब्जेक्ट्स के साथ काम कर सके, भले ही उन क्लासेस का व्यवहार अलग हो:

class Person:
    def get_details(self):
        return "Details of a person."

class Student(Person):
    def get_details(self):
        return "Details of a student."

class Teacher(Person):
    def get_details(self):
        return "Details of a teacher."

# Example usage
def print_details(person):
    print(person.get_details())

student = Student()
teacher = Teacher()

print_details(student) 
print_details(teacher) 
Details of a student.
Details of a teacher.

इस उदाहरण में, print_details() फ़ंक्शन Person टाइप के किसी भी ऑब्जेक्ट को स्वीकार कर सकता है, लेकिन वह इस आधार पर उचित get_details() मेथड को कॉल करेगा कि ऑब्जेक्ट Student है या Teacher।

आम गलतियाँ और सर्वोत्तम प्रथाएँ

इनहेरिटेंस शक्तिशाली है, लेकिन इसका गलत उपयोग करना आसान है। मैं कुछ विचार साझा करूँगा जो आपको इन अवधारणाओं का बेहतर लाभ उठाने में मदद करेंगे।

ओवरराइड किए गए मेथड्स से अप्रत्याशित व्यवहार से बचें

जब कोई चाइल्ड क्लास अपने पैरेंट के किसी मेथड को ओवरराइड करती है, तो व्यवहार बदल सकता है।

उदाहरण के लिए, यदि पैरेंट क्लास Employee में calculate_pay() मेथड है, और Manager चाइल्ड क्लास इसे सभी परिदृश्यों को ध्यान में रखे बिना ओवरराइड कर देती है, तो यह गलत वेतन गणना दे सकती है।

इस स्थिति में सर्वोत्तम प्रथा यह है कि ओवरराइड किए गए मेथड्स का हमेशा पूरी तरह परीक्षण करें और उनके व्यवहार का दस्तावेज़ीकरण करें।

इनहेरिटेंस और कंपोज़िशन में से चुनना

मुझे पता है कि यह लेख इनहेरिटेंस के बारे में है, लेकिन यह हमेशा सही तरीका नहीं होता। कभी-कभी कंपोज़िशन, जहाँ आप क्लासेस को एक्सटेंड करने के बजाय ऑब्जेक्ट्स को मिलाकर बनाते हैं, आपके काम के लिए बेहतर फिट हो सकता है।

अंतर को सबसे बुनियादी रूप में सुलझाकर कहें, तो सोचें कि:

  • Inheritance का संबंध होता है "Is-a" संबंधों से। उदाहरण के लिए, Manager एक Employee है।

  • Composition का संबंध होता है "Has-a" संबंधों से। उदाहरण के लिए, Car के पास एक Engine होता है।

तो, आपको कैसे पता चले कि कब कंपोज़िशन सबसे अच्छा तरीका है? कंपोज़िशन का उपयोग तब करें जब संबंध सख्ती से पदानुक्रमीय न हो और/या जब आप क्लासेस के बीच टाइट कपलिंग कम करना चाहते हों।

या, हम यह भी कह सकते हैं कि जहाँ इनहेरिटेंस संबंधों का मॉडल बनाता है, वहीं कंपोज़िशन कार्यक्षमता पर केंद्रित होता है। मदद के लिए, इसे देखें:

  • इनहेरिटेंस का उपयोग तब करें जब ऑब्जेक्ट्स स्वाभाविक रूप से पदानुक्रमीय हों। उदाहरण के लिए, Animal > Bird > Parrot।

  • कंपोज़िशन का उपयोग तब करें जब ऑब्जेक्ट्स कार्यक्षमता साझा करते हों लेकिन परस्पर संबंधित न हों। उदाहरण के लिए, Printer और Scanner दोनों DeviceManager का उपयोग करते हैं।

डीप इनहेरिटेंस चेन्स से बचें

गहरी इनहेरिटेंस चेन्स (पैरेंट-चाइल्ड संबंधों के कई स्तर) आपके कोड को पढ़ने और मेंटेन करने में कठिन बना सकती हैं। यह समस्या इसलिए होती है क्योंकि पैरेंट क्लास में बदलाव अनजाने में कई चाइल्ड क्लासेस को प्रभावित कर सकते हैं। साथ ही, डीबगिंग जटिल हो जाती है क्योंकि व्यवहार कई स्तरों में फैला होता है।

इस स्थिति में सर्वोत्तम प्रथा है कि हायरार्की को उथला रखें। साथ ही, यदि चेन्स बहुत गहरी होने लगे तो कंपोज़िशन (जैसा मैंने पहले बताया) का उपयोग करने या किसी चेन को अलग-अलग हायरार्की में बाँटने पर विचार करें।

निष्कर्ष

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

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

यदि आप और गहराई में जाना चाहते हैं, तो हमारे Programming Paradigm Concepts कोर्स को देखें, जो इनहेरिटेंस और अन्य विचारों की गहन समझ देता है। हमारा Python Developer करियर ट्रैक भी एक अच्छा संसाधन है, जो उन्नत प्रोग्रामिंग कौशल विकसित करने के लिए एक व्यापक मार्ग प्रदान करता है और आपको सॉफ्टवेयर डेवलपमेंट के लिए तैयार करता है।

Samuel Shaibu

लेखक

Samuel Shaibu

अनुभवी डेटा प्रोफेशनल और लेखक, जो डेटा क्षेत्र में उभरते विशेषज्ञों को सशक्त बनाने के प्रति प्रतिबद्ध हैं।

Python इनहेरिटेंस FAQs

Python में इनहेरिटेंस क्या है?

Python में इनहेरिटेंस वह तंत्र है जो एक क्लास को दूसरी क्लास से एट्रिब्यूट्स और मेथड्स विरासत में लेने देता है, जिससे कोड का पुन: उपयोग और पदानुक्रमित क्लास संरचनाएँ संभव होती हैं।

Python इनहेरिटेंस कैसे काम करता है?

Python इनहेरिटेंस इस तरह काम करता है कि आप एक नई क्लास परिभाषित करते हैं जो मौजूदा क्लास से एट्रिब्यूट्स और मेथड्स विरासत में लेती है, जिससे पदानुक्रमित क्लास संरचनाएँ बनती हैं।

Python में इनहेरिटेंस के प्रकार क्या हैं?

Python कई प्रकार की इनहेरिटेंस का समर्थन करता है, जिनमें सिंगल, मल्टिपल, मल्टीलेवल और हायरार्किकल इनहेरिटेंस शामिल हैं।

Python में सिंगल और मल्टिपल इनहेरिटेंस में क्या अंतर है?

सिंगल इनहेरिटेंस में एक ही पैरेंट क्लास होता है, जबकि मल्टिपल इनहेरिटेंस एक क्लास को एक से अधिक पैरेंट क्लासेस से विरासत लेने देती है।

आप Python में इनहेरिटेंस कैसे इम्प्लीमेंट करते हैं?

इनहेरिटेंस को इम्प्लीमेंट करने के लिए नई क्लास परिभाषित करें और उसकी परिभाषा में पैरेंट क्लास निर्दिष्ट करें, इस सिंटैक्स का उपयोग करते हुए: class ChildClass(ParentClass):।

Python में इनहेरिटेंस का उपयोग करने के क्या लाभ हैं?

इनहेरिटेंस कोड के पुन: उपयोग को बढ़ावा देता है, पदानुक्रमित क्लास संरचनाएँ बनाने देता है, और पॉलीमॉर्फ़िज़्म को सपोर्ट करता है, जिससे कोड अधिक लचीला और मेंटेन करने योग्य बनता है।

आप Python में मल्टिपल इनहेरिटेंस कैसे इम्प्लीमेंट करते हैं?

मल्टिपल इनहेरिटेंस को इस तरह इम्प्लीमेंट किया जाता है कि एक क्लास एक से अधिक बेस क्लासेस से विरासत लेती है; Python मेथड रिज़ॉल्यूशन को मेथड रिज़ॉल्यूशन ऑर्डर (MRO) के माध्यम से संभालता है।

विषय