ارث بری در برنامه نویسی شئی گرای پایتون
ارث بری(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 بهتر آشنا شویم و بتونیم از آنها در پروژه های خود، مخصوصا دیپ لرنینگ استفاده کنیم.
دیدگاه ها