در برنامهنویسی شیءگرا، متدهای یک کلاس میتوانند در کلاسهای (فرزند) مجدداً تعریف شوند تا عملکرد متد را بازنویسی (Overriding) کنند. این عملیات به نام “method overriding” یا “متد Overriding” شناخته میشود. در این مقاله، با مفهوم و کاربردهای method overriding در پایتون آشنا میشویم و نحوه استفاده از آن را به تفصیل بررسی میکنیم.همچنین پیشنهاد میکنیم از آموزشهای دیگر ما نیز دیدن فرمایید:
- لیست و نحوه کار با آن
- دیکشنری در پایتون
- Tuple در پایتون
- if در پایتون
- حلقه for
- حلقه while
- تابع در پایتون
- تبدیل نوع داده
مفهوم method overriding در پایتون
بازنویسی متد یعنی تعریف مجدد یک متد (تابع) در کلاسی که از یک کلاس والد ارثبری کرده است. معمولاً در کلاسهای فرزند، ممکن است نیاز به تغییر عملکرد یک متد ارثبری شده باشد تا به نیازها و خصوصیات کلاس فرزند بپیوندد. به عبارت دیگر، میتوانیم متدی که در کلاس والد تعریف گردیده است را در کلاس فرزند به شکل متفاوتی پیادهسازی کنیم.
فرض کنید که یک کلاس والد به نام Animal
داریم که دارای یک متد به نام speak
است. حالا میخواهیم از این کلاس یک کلاس فرزند به نام Dog
ایجاد کنیم و متد speak
را در آن بازنویسی کنیم.
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "ووف! ووف!"
در اینجا کلاس Dog
از کلاس Animal
ارثبری کرده و متد speak
را بازنویسی کرده است. اکنون وقتی یک شیء از کلاس Dog
ایجاد میکنیم و متد speak
را فراخوانی میکنیم، پیغام “ووف! ووف!” برگشت داده میشود.
dog = Dog()
print(dog.speak()) # خروجی: "ووف! ووف!"
در اینجا دیدیم که بازنویسی(override) متد به کلاسها امکان میدهد که به عنوان کلاسهای فرزند، عملکرد مورد نظر خود را داشته باشند.
کاربردهای method overriding
method overriding در پایتون و برنامهنویسی شیءگرا دارای کاربردهای متعددی است که به برنامهنویسان امکان ایجاد کد منطقیتر و قابلیت انعطافپذیری بیشتری در پروژههای خود میدهد. در زیر به برخی از کاربردهای اصلی بازنویسی متدها در پایتون اشاره میکنیم:
- عملکرد مخصوص کلاسهای فرزند: وقتی که کلاسها از یک کلاس والد ارثبری میکنند، ممکن است نیاز به تغییرات در عملکرد متدها برای تطابق با خصوصیات کلاس فرزند داشته باشیم. در اینجا بازنویسی متدها به ما این امکان را میدهد که عملکرد مخصوص کلاسهای فرزند را تعریف کنیم.
- پلیمورفیسم یا چندریختی: بازنویسی متدها یکی از مفاهیم کلیدی پلیمورفیسم در برنامهنویسی شیءگرا است. این به ما این امکان را میدهد که متدهای بازنویسی گردیده در کلاسهای فرزند را با توجه به نیازهای خود پیادهسازی کنیم تا عملکرد متفاوتی داشته باشند. این ویژگی به انعطافپذیری کد و امکان استفاده از یک متد با نام یکسان با عملکردهای متفاوت در کلاسهای مختلف میکند.
- توسعه ویژگیهای کلاسهای فرزند: در برخی موارد، ممکن است ویژگیهای اضافی به کلاسهای فرزند اضافه شوند. بازنویسی متدها در این موارد به ما این امکان را میدهد که متدهای جدید را با توجه به این ویژگیها پیادهسازی کنیم.
- استفاده از کلاسهای پایه (Abstract Classes): در پایتون، میتوانید از کلاسهای پایه (Abstract Classes) استفاده کنید که شامل متدهای خالی هستند و باید در کلاسهای فرزند پیادهسازی شوند. بازنویسی متدهای کلاسهای پایه در کلاسهای فرزند به کمک دیگر متدهایی که باید پیادهسازی شوند، میتواند به پیادهسازی راحتتر کد بسیار کمک کند.
نحوه استفاده از بازنویسی متدها در پایتون
برای method overriding در کلاس فرزند، باید متد مورد نظر را با دقت بازنویسی کنید. این متد باید نام یکسان و تعداد و نوع پارامترهای متد اصلی در کلاس والد داشته باشد. برای اینکه متد بازنویسی شده به متد اصلی در کلاس والد دسترسی داشته باشد، میتوانید از کلیدواژه super()
استفاده کنید.
class ParentClass:
def my_method(self):
return "متد اصلی در کلاس والد"
class ChildClass(ParentClass):
def my_method(self):
result = super().my_method() # بازنویسی متد با دسترسی به متد اصلی
return f"متد بازنویسی شده: {result}"
در اینجا، متد my_method
در کلاس ChildClass
بازنویسی شده است. با استفاده از super().
، ما به متد اصلی در کلاس والد دسترسی داریم و میتوانیم نتیجه آن را به تغییرات خود اضافه کنیم.()
my_method
حالا میتوانیم یک شیء از کلاس فرزند ایجاد کرده و متد بازنویسی گردیده را فراخوانی کنیم:
child = ChildClass()
print(child.my_method())
# خروجی: "متد بازنویسی شده: متد اصلی در کلاس والد"
در نتیجه، متد بازنویسی گردیده در کلاس فرزند تغییرات خود را به متد اصلی در کلاس پدر اضافه کرده و خروجی متفاوتی ارائه میشود.
نکات مهم در بازنویسی متدها
در method overriding در پایتون، برخی نکات مهم وجود دارند که باید به آنها توجه کنید:
- نام و پارامترها: نام متد بازنویسی گردیده باید دقیقاً با نام متد اصلی در کلاس والد یکسان باشد و تعداد و نوع پارامترها همانند متد اصلی باشد.
- استفاده از
super()
: در صورتی که میخواهید به متد اصلی در کلاس والد دسترسی داشته باشید و عملکرد آن را تغییر دهید، ازsuper()
استفاده کنید. - پیادهسازی اختیاری: بازنویسی متدها اختیاری است و ممکن است در کلاسهای فرزند تعدادی از متدها را بازنویسی کنید و تعدادی را با عملکرد اصلی کلاس والد استفاده کنید.
- اهمیت تست و اعتبارسنجی: همواره اهمیت تست و اعتبارسنجی متدهای بازنویسی گردیده بسیار بالاست. عملکرد برنامه را تحت تست قرار داده و همچنین نتایج را با متد اصلی کلاس والد مقایسه کنید.