ارث بری در برنامه نویسی شئی گرای پایتون


ارث بری(inheritance) یکی از ویژگی های خیلی خوب برنامه نویسی شئی گرا در پایتون است. با کمک ارث بری میتوانیم از روی کلاسهای قبلی، کلاسهای جدید بسازیم. اونهارو توسعه بدهیم و کلاسهای قدرتمندتری ایجاد کنیم. بدون اینکه نیازی به کپی کردن کدها در کلاسهای جدید داشته باشیم. در این پست در ابتدا با مفهوم ارث بری در OOP آشنا می‌شویم و سپس با یک مثال عملی توضیح می‌دهیم که چطور میتوان در پایتون از این ویژگی استفاده کرد.  

ارث بری در برنامه نویسی شئی گرا

ویژگی ارث بری از تکرار یک کد یکسان در کلاسهای مختلف جلوگیری می‌کند. به عبارتی ارث بری از افزونگی (redundancy) کدها جلوگیری می‌کند.

ما با کمک ارث بری در پایتون میتوانیم از روی کلاس یا کلاسهای قبلی، کلاس جدیدی تعریف کنیم که هم ویژگی های کلاسهای قبلی را داشته باشد و هم یک سری ویژگی های جدید بهش اضافه کنیم.

این ویژگی برنامه نویسی شئی گرا به ما کمک می‌کند تا به راحتی کلاسهای قبلی رو توسعه بدهیم.

ارث بری OOP در پایتون

در این نوع ارث بری، یک والد و یک فرزند داریم. کلاس فرزند، علاوه بر ویژگی هایی که خودش دارد، تمام ویژگی های والد رو هم به ارث میبرد. یعنی به همه شناسه و متدهای تعریف شده در کلاس والد دسترسی دارد و میتواند از آنها برای پیش برد اهدافش استفاده کند.

ارث بری در برنامه نویسی شئی گرای پایتون

من عمدا اندازه کلاس فرزند را بزرگتر در نظر گرفتم تا متوجه شویم که کلاس فرزند توسعه یافته کلاس والد هست و علاوه بر ویژگی های کلاس والد، ویژگی های جدیدی هم میتواند داشته باشد.

در پایتون به شکل زیر این نوع ارث بری تعریف می‌شود:

Python

class ChlidClass(ParentClass):

    pass

ParentClass کلاسی هست که قبلا تعریف شده و برای خودش یک سری شناسه و متدی دارد. ما به شکل بالا توانسیم یک کلاس جدید (کلاس فرزند) از روی کلاس والد بسازیم. فعلا شناسه یا متد جدیدی برای کلاس فرزند تعریف نکردیم. با همین کار ساده، فعلا کلاس فرزند تمامی ویژگی های کلاس ولد رو دارد.

بیایید با یک مثال ساده این نوع ارث بری رو باهم بررسی کنیم. فرض کنید، یک  کلاسی برای انسان به اسم Person  داریم که شناسه ها و متدهای زیر را دارد:

ارث بری در برنامه نویسی شئی گرای پایتون

دو شناسه سن و اسم دارد و یک متد که وقتی فراخوانی شود، اسم و سن فرد را چاپ می‌کند. در پایتون به شکل زیر این کلاس رو میشه تعریف کرد:

Python

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

    def show_info(self):
        print(f'name is {self.name}')
        print(f'age is {self.age}')

p1 = Person('Jack', 36)
p1.show_info()

>>> name is Jack
    age is 36

حال بیایید یک کلاس جدید از روی کلاس Person بسازیم. فرض کنید یک کلاسی برای Employee تعریف کنیم که شناسه ها و متدهای زیر را داشته باشد:

ارث بری در برنامه نویسی شئی گرای پایتون

همانطور که میبینید، دو شناسه name و age و متد ()show_info در کلاس Person هم تعریف شده بودند. اگر از ارث بری استفاده نکنیم باید، کد مربوط به این هارو مجدد بنویسیم. اینجا مثال ساده است و کپی کردن چنان کارو شلوغ نمیکنه. ولی اگر کد ما شامل میلیونها خط باشه چی؟ اون موقع هست که کارایی ارث بری به چشم میاد. باعث میشه توسعه کدهارو بسیار ساده شود و کمک میکنه یک کد بسیار منظمی داشته باشیم.

خب حالا بیاییم با کمک ارث بری کلاس Employee رو تعریف کنیم.

مرحله اول: ارث بری ساده

Python

...
class Employee(Person):
    pass

p1 = Person('Jack', 36)
p1.show_info()

e1 = Employee('Rose', 30)
e1.show_info()
>>>  name is Jack
age is 36
name is Rose
age is 30

همانطورکه میبیند با این کار خیلی ساده، ما کلاس جدیدی تعریف کردیم و به همه مشخصات (شناسه ها و متدهای کلاس والد) دسترسی پیدا کردیم.

مرحله دوم: تعریف شناسه های کلاس جدید

همانطور که دیدیم، در کلاس دوم، ما علاوه بر شناسه های name, age شناسه ی دیگری به اسم salary داریم که باید اون رو تعریف کنیم.

برای اینکار کافیه که متد __init__ رو override بکنیم.

Python

...
class Employee(Person):
    def __init__(self,name, age, salary):
        super(Employee, self).__init__(name, age)
        self.salary = salary

p1 = Person('Jack', 36)
p1.show_info()

e1 = Employee('Rose', 30,12000)
e1.show_info()
print(e1.salary)
>>>  name is Jack
age is 36
name is Rose
age is 30
12000

همانطور که می بینید، ما برای کلاس فرزند یک متد __init__ تعریف کردیم، و در اون شناسه جدید رو تعریف کردیم، و دو شناسه دیگر رو هم چون در کلاس والد قبلا تعریف کرده ایم مجددا تعریف نکردیم و  ارث بری کردیم. فقط با کمک متد super مقادیر اونهارو به کلاس بالایی (به عبارتی به کلاس والد) دادیم تا اون شناساسه ها رو در متد __init__خودش مقداردهی کند.

 

الان ما به این شکل میتوانیم شناسه های جدید برای کلاس فرزند تعریف کنیم. اصلا نیازی نیست مجدد همه شناسه هارو تعریف کنیم. فقط شناسه جدید رو به شکل بالا، به بقیه شناسه ها اضافه میکنیم.

دقت کنیم که الان کلاس فرزند علاوه بر شناسه های name, age یک شناسه دیگری به اسم salary دارد ولی کلاس والد فقط دو شناسه name, age را دارد.

مرحله سوم: تعریف متد برای کلاس فرزند

حال بیایید برای کلاس فرزند، دو متد دیگر را هم تعریف کنیم. برای اینکار به شکل زیر عمل میکنیم

Python

...
class Employee(Person):
    def __init__(self,name, age, salary):
        super(Employee, self).__init__(name, age)
        self.salary = salary

    def get_raise(self,bonus):
        self.salary = self.salary + bonus

    def show_salary(self):
        print(f'salary is {self.salary}')

e1 = Employee('Rose', 30,12000)
e1.show_info()
e1.show_salary()
e1.get_raise(1000)

>>>  name is Rose
age is 30
salary is 12000
salary is 13000

با اینکار ما توانسیم برای کلاس جدید، دو متد اضافه دیگری هم تعریف کنیم. الان کلاس فرزند علاوه بر متد ()show_info که از کلاس والد ارث بری کرده، دو متد دیگر به اسم ()show_salary و ()get_raiseرو تعریف کردیم. این در حالی است که کلاس والد فقط یک متد به اسم ()show_info دارد.

به همین سادگی میتوانیم در پایتون از ویژگی ارثبری برنامه نویسی شئی گرا استفاده کنیم. ما دو حالت دیگر برای ارث بری داریم که در ادامه شکل آنها رو قرار می دهیم.

ارث بری زنجیره ای

در این نوع ارث بری، زنجیره ی ارث بری ادامه پیدا میکند. یعنی هر کلاس از کلاس قبلی خود ارث میبرد. و رفته رفته مدام به ویژگی هایش اضافه می شود. و هر کلاس توسعه یافته کلاسهای قبلی می شود.

ارث بری در برنامه نویسی شئی گرای پایتون

ارث بری از چند والد به صورت همزمان

در این نوع ارث بری، کلاس فرزند همزمان از چندین کلاس والد ارث بری می‌کند.

ارث بری در برنامه نویسی شئی گرای پایتون



در دوره برنامه نویسی  شیء گرای پایتون، به صورت تخصصی و از پایه مبحث ارث بری را آموزش داده ایم و کلی مثال و پروژه عملی انجام داده ایم تا با این ویژگی مهم OPP بهتر آشنا شویم و بتونیم از آنها در پروژه های خود، مخصوصا دیپ لرنینگ استفاده کنیم.


دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

code