Python Inheritance

பைத்தான் பரம்பரை கற்றுக்கொள்ளுங்கள்

Python - பரம்பரை

பரம்பரை மற்றொரு வகுப்பிலிருந்து அனைத்து முறைகள் மற்றும் பண்புகளையும் பெறும் ஒரு வகுப்பை வரையறுக்க அனுமதிக்கிறது.

பெற்றோர் வகுப்பு

பெயர்: பெற்றோர் வகுப்பு / அடிப்படை வகுப்பு

செயல்பாடு: மரபுரிமையாக வழங்கப்படுகிறது

எடுத்துக்காட்டு: Person வகுப்பு

குழந்தை வகுப்பு

பெயர்: குழந்தை வகுப்பு / பெறப்பட்ட வகுப்பு

செயல்பாடு: மரபுரிமையாகப் பெறுகிறது

எடுத்துக்காட்டு: Student வகுப்பு

பெற்றோர் வகுப்பை உருவாக்குதல்

எந்தவொரு வகுப்பும் பெற்றோர் வகுப்பாக இருக்க முடியும், எனவே தொடரியல் வேறு எந்த வகுப்பையும் உருவாக்குவதற்கும் ஒன்றுதான்:

எடுத்துக்காட்டு

Person என்று பெயரிடப்பட்ட ஒரு வகுப்பை உருவாக்கவும், firstname மற்றும் lastname பண்புகளுடன், மற்றும் ஒரு printname முறையுடன்:

class Person:
    def __init__(self, fname, lname):
        self.firstname = fname
        self.lastname = lname
    
    def printname(self):
        print(self.firstname, self.lastname)

# Person வகுப்பைப் பயன்படுத்தி ஒரு பொருளை உருவாக்கவும், பின்னர் printname முறையை செயல்படுத்தவும்:
x = Person("John", "Doe")
x.printname()  # Output: John Doe

வகுப்பு கட்டமைப்பு:

வகுப்பு பெயர்: Person

பண்புகள்: firstname, lastname

முறைகள்: __init__(), printname()

பயன்பாடு: பொதுவான நபர் தரவுகளைக் கையாளுதல்

குழந்தை வகுப்பை உருவாக்குதல்

மற்றொரு வகுப்பிலிருந்து செயல்பாட்டைப் பெறும் ஒரு வகுப்பை உருவாக்க, குழந்தை வகுப்பை உருவாக்கும்போது பெற்றோர் வகுப்பை ஒரு அளவுருவாக அனுப்பவும்:

எடுத்துக்காட்டு

Student என்று பெயரிடப்பட்ட ஒரு வகுப்பை உருவாக்கவும், இது Person வகுப்பிலிருந்து பண்புகள் மற்றும் முறைகளைப் பெறும்:

class Student(Person):
    pass

# Student வகுப்பைப் பயன்படுத்தி ஒரு பொருளை உருவாக்கவும், பின்னர் printname முறையை செயல்படுத்தவும்:
x = Student("Mike", "Olsen")
x.printname()  # Output: Mike Olsen

⚠️ கவனிக்க:

வகுப்பிற்கு வேறு எந்த பண்புகளையும் அல்லது முறைகளையும் சேர்க்க விரும்பாதபோது pass முக்கியச்சொல்லைப் பயன்படுத்தவும்.

மரபுரிமை பாய்வு:

பெற்றோர் வகுப்பு: Person

→ பெறப்பட்டது: firstname, lastname (பண்புகள்)

→ பெறப்பட்டது: __init__(), printname() (முறைகள்)

குழந்தை வகுப்பு: Student

தற்போதைய நிலை: Person இன் அனைத்து பண்புகள் மற்றும் முறைகளும்

__init__() செயல்பாட்டைச் சேர்த்தல்

இதுவரை நாம் அதன் பெற்றோரிடமிருந்து பண்புகள் மற்றும் முறைகளைப் பெறும் ஒரு குழந்தை வகுப்பை உருவாக்கியுள்ளோம்.

குழந்தை வகுப்பில் (pass முக்கியச்சொல்லுக்குப் பதிலாக) __init__() செயல்பாட்டைச் சேர்க்க விரும்புகிறோம்.

🏁 குறிப்பு:

__init__() செயல்பாடு வகுப்பு ஒரு புதிய பொருளை உருவாக்க பயன்படுத்தப்படும் ஒவ்வொரு முறையும் தானாகவே அழைக்கப்படுகிறது.

குழந்தை வகுப்பில் __init__() சேர்த்தல்

class Student(Person):
    def __init__(self, fname, lname):
        # பண்புகள் முதலியன சேர்க்கவும்.
        pass

சிக்கல்: பெற்றோரின் __init__() மரபுரிமை இழக்கப்படுகிறது

முடிவு: firstname, lastname தொடங்கப்படவில்லை

சரியான __init__() செயல்பாடு

class Student(Person):
    def __init__(self, fname, lname):
        Person.__init__(self, fname, lname)
        # கூடுதல் தொடக்கம்

தீர்வு: பெற்றோரின் __init__() ஐ வெளிப்படையாக அழைக்கவும்

முடிவு: firstname, lastname சரியாக தொடங்கப்படுகிறது

🚨 முக்கிய குறிப்பு:

குழந்தையின் __init__() செயல்பாடு பெற்றோரின் __init__() செயல்பாட்டின் மரபுரிமையை மேலெழுதுகிறது.

super() செயல்பாட்டைப் பயன்படுத்துதல்

Python குழந்தை வகுப்பு அதன் பெற்றோரிடமிருந்து அனைத்து முறைகள் மற்றும் பண்புகளையும் பெறும் super() செயல்பாட்டையும் கொண்டுள்ளது:

class Student(Person):
    def __init__(self, fname, lname):
        super().__init__(fname, lname)
        # கூடுதல் தொடக்கம்

வெளிப்படையான அழைப்பு

class Student(Person):
    def __init__(self, fname, lname):
        Person.__init__(self, fname, lname)

முறை: பெற்றோர் வகுப்பு பெயரைக் குறிப்பிடுகிறது

நன்மை: தெளிவானது

குறைபாடு: பெற்றோர் பெயர் மாறினால் புதுப்பிக்க வேண்டும்

super() பயன்பாடு

class Student(Person):
    def __init__(self, fname, lname):
        super().__init__(fname, lname)

முறை: பெற்றோர் வகுப்பு பெயரைக் குறிப்பிடவில்லை

நன்மை: பராமரிப்பு எளிதானது

குறைபாடு: குறைவான வெளிப்படையானது

💡 உதவிக்குறிப்பு:

super() செயல்பாட்டைப் பயன்படுத்துவதன் மூலம், நீங்கள் பெற்றோர் உறுப்பின் பெயரைப் பயன்படுத்த வேண்டியதில்லை, அது தானாகவே அதன் பெற்றோரிடமிருந்து முறைகள் மற்றும் பண்புகளைப் பெறும்.

பண்புகளைச் சேர்த்தல்

எடுத்துக்காட்டு 1: நிலையான பண்பு

class Student(Person):
    def __init__(self, fname, lname):
        super().__init__(fname, lname)
        self.graduationyear = 2019  # நிலையான ஆண்டு

x = Student("Mike", "Olsen")
print(x.graduationyear)  # Output: 2019
print(x.firstname)       # Output: Mike
print(x.lastname)        # Output: Olsen

எடுத்துக்காட்டு 2: மாறி பண்பு

class Student(Person):
    def __init__(self, fname, lname, year):
        super().__init__(fname, lname)
        self.graduationyear = year  # மாறி ஆண்டு

x = Student("Mike", "Olsen", 2019)
print(x.graduationyear)  # Output: 2019

y = Student("Anna", "Smith", 2020)
print(y.graduationyear)  # Output: 2020

மரபுரிமை விரிவாக்கம்:

பெற்றோர் பண்புகள்: firstname, lastname

குழந்தை பண்புகள்: graduationyear (புதியது!)

மொத்த பண்புகள்: firstname, lastname, graduationyear

பெறப்பட்டது: பெற்றோரிடமிருந்து

சேர்க்கப்பட்டது: குழந்தையில் புதிதாக

முறைகளைச் சேர்த்தல்

எடுத்துக்காட்டு

Student வகுப்பில் welcome என்ற முறையைச் சேர்க்கவும்:

class Student(Person):
    def __init__(self, fname, lname, year):
        super().__init__(fname, lname)
        self.graduationyear = year
    
    def welcome(self):
        print("Welcome", self.firstname, self.lastname, 
              "to the class of", self.graduationyear)

# பயன்பாடு
x = Student("Mike", "Olsen", 2019)
x.printname()   # பெறப்பட்ட முறை: Mike Olsen
x.welcome()     # புதிய முறை: Welcome Mike Olsen to the class of 2019

⚠️ முறை மேலெழுதுதல்:

குழந்தை வகுப்பில் பெற்றோர் வகுப்பில் உள்ள ஒரு செயல்பாட்டின் அதே பெயரில் ஒரு முறையைச் சேர்க்கினால், பெற்றோர் முறையின் மரபுரிமை மேலெழுதப்படும்.

class Person:
    def introduction(self):
        print("I am a person")

class Student(Person):
    def introduction(self):  # பெற்றோர் முறையை மேலெழுதுகிறது
        print("I am a student")

x = Student()
x.introduction()  # Output: I am a student (பெற்றோர் முறை அல்ல)

பல மரபுரிமை நிலைகள்

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def introduce(self):
        print(f"I am {self.name}, {self.age} years old")

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id
    
    def study(self):
        print(f"{self.name} is studying")

class GraduateStudent(Student):
    def __init__(self, name, age, student_id, research_topic):
        super().__init__(name, age, student_id)
        self.research_topic = research_topic
    
    def research(self):
        print(f"{self.name} is researching {self.research_topic}")

# பயன்பாடு
grad_student = GraduateStudent("Alice", 25, "S12345", "AI")
grad_student.introduce()   # பெறப்பட்டது: Person இலிருந்து
grad_student.study()       # பெறப்பட்டது: Student இலிருந்து  
grad_student.research()    # புதியது: GraduateStudent இல்

மரபுரிமை சங்கிலி:

நிலை 1: Person (அடிப்படை வகுப்பு)

→ பெறப்பட்டது: name, age, introduce()

நிலை 2: Student (Person இலிருந்து பெறப்பட்டது)

→ பெறப்பட்டது: Person இன் அனைத்தும் + student_id, study()

நிலை 3: GraduateStudent (Student இலிருந்து பெறப்பட்டது)

→ பெறப்பட்டது: Student இன் அனைத்தும் + research_topic, research()

நடைமுறை எடுத்துக்காட்டு

# பெற்றோர் வகுப்பு: வாகனம்
class Vehicle:
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year
    
    def start(self):
        print(f"{self.brand} {self.model} starting...")
    
    def stop(self):
        print(f"{self.brand} {self.model} stopping...")

# குழந்தை வகுப்பு 1: கார்
class Car(Vehicle):
    def __init__(self, brand, model, year, doors):
        super().__init__(brand, model, year)
        self.doors = doors
    
    def honk(self):
        print(f"{self.brand} {self.model} honking!")

# குழந்தை வகுப்பு 2: மோட்டார் சைக்கிள்
class Motorcycle(Vehicle):
    def __init__(self, brand, model, year, has_sidecar):
        super().__init__(brand, model, year)
        self.has_sidecar = has_sidecar
    
    def wheelie(self):
        print(f"{self.brand} {self.model} doing a wheelie!")

# பயன்பாடு
my_car = Car("Toyota", "Camry", 2020, 4)
my_car.start()      # பெறப்பட்டது: Toyota Camry starting...
my_car.honk()       # புதியது: Toyota Camry honking!

my_bike = Motorcycle("Harley", "Davidson", 2019, False)
my_bike.start()     # பெறப்பட்டது: Harley Davidson starting...
my_bike.wheelie()   # புதியது: Harley Davidson doing a wheelie!

வகை சரிபார்ப்பு மற்றும் isinstance()

class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        print("Animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def speak(self):
        print("Meow!")

# உறவுகளை சரிபார்த்தல்
dog = Dog("Buddy")
cat = Cat("Whiskers")

print(isinstance(dog, Dog))      # True
print(isinstance(dog, Animal))   # True (Dog என்பது Animal இன் துணைவகுப்பு)
print(isinstance(dog, Cat))      # False

print(isinstance(cat, Cat))      # True
print(isinstance(cat, Animal))   # True (Cat என்பது Animal இன் துணைவகுப்பு)

# பல்வகைத்தன்மை
animals = [dog, cat]
for animal in animals:
    animal.speak()  # ஒவ்வொரு வகைக்கும் சரியான ஒலி
    # Output: Woof!
    #         Meow!

பயிற்சி

பிழை ஏற்படாமல் இருக்க, வெற்று வகுப்பிற்குள் பயன்படுத்த சரியான முக்கியச்சொல் எது?

பயிற்சி கேள்வி:

empty
✗ தவறு! Python இல் empty என்ற முக்கியச்சொல் இல்லை. வெற்று தொகுதிகளுக்கு pass பயன்படுத்தப்படுகிறது.
inherit
✗ தவறு! inherit என்பது Python முக்கியச்சொல் அல்ல. வெற்று வகுப்புகளுக்கு pass பயன்படுத்தப்படுகிறது, மரபுரிமைக்கு வகுப்பு பெயர்களை அடைப்புக்குறிக்குள் அனுப்புகிறோம்.
pass
✓ சரி! pass முக்கியச்சொல் வெற்று வகுப்புகள் மற்றும் செயல்பாடுகளுக்கு பயன்படுத்தப்படுகிறது. இது Python க்கு "இங்கே எதுவும் செய்ய வேண்டாம்" என்று கூறுகிறது, இது தொடரியல் பிழையைத் தவிர்க்கிறது.

சிறந்த நடைமுறைகள்

மரபுரிமைக்கு super() பயன்படுத்தவும்: பெற்றோர் வகுப்பு பெயர் மாறினால் குறியீட்டைப் புதுப்பிக்க தேவையில்லை
தொடர்புடைய வகுப்புகளுக்கு மட்டும் மரபுரிமையைப் பயன்படுத்தவும்: "is-a" உறவை சரிபார்க்கவும் (Student is a Person)
பொதுவான செயல்பாட்டை பெற்றோர் வகுப்பில் வைக்கவும்: குறியீட்டு மறுபயன்பாட்டை அதிகரிக்கிறது
மிகவும் ஆழமான மரபுரிமை சங்கிலிகளைத் தவிர்க்கவும்: 2-3 நிலைகளுக்கு மேல் பராமரிப்பு கடினம்
வகை சரிபார்ப்புக்கு isinstance() பயன்படுத்தவும்: type() க்குப் பதிலாக, துணைவகுப்புகளைக் கணக்கில் எடுத்துக்கொள்கிறது
செயல்பாட்டு மேலெழுதுதல் குறித்து ஆவணப்படுத்தவும்: பெற்றோர் செயல்பாடுகள் எவை மேலெழுதப்படுகின்றன என்பதை ஆவணப்படுத்தவும்