آموزش پایتون - بازنویسی متد

بازنویسی متد در پایتون

بازنویسی متد (Method Overriding) در پایتون به معنای تعریف متدی در یک زیرکلاس با همان نام متدی در کلاس والد آن است. در این حالت، مفسر پایتون در زمان اجرا و بر اساس شیء واقعی مورد اشاره، تعیین می‌کند که کدام متد فراخوانی شود.

همیشه می‌توانید متدهای کلاس والد خود را بازنویسی کنید. یکی از دلایل بازنویسی متدهای کلاس والد این است که ممکن است بخواهید در زیرکلاس خود قابلیت‌های خاص یا متفاوتی داشته باشید.

مثال

در کد زیر، متدی به نام myMethod را در کلاس Parent بازنویسی می‌کنیم.

# define parent class
class Parent: 
   def myMethod(self):
      print ('Calling parent method')

# define child class
class Child(Parent): 
   def myMethod(self):
      print ('Calling child method')

# instance of child
c = Child() 
# child calls overridden method
c.myMethod()

با اجرای کد بالا، خروجی زیر تولید می‌شود:

Calling child method

برای درک بازنویسی متد در پایتون، مثال دیگری را بررسی می‌کنیم. از کلاس Employee زیر به‌عنوان کلاس والد استفاده می‌کنیم:

class Employee:
   def __init__(self,nm, sal):
      self.name=nm
      self.salary=sal
   def getName(self):
      return self.name
   def getSalary(self):
      return self.salary

در مرحله بعد، کلاس SalesOfficer را تعریف می‌کنیم که از Employee به‌عنوان کلاس والد استفاده می‌کند. این کلاس، متغیرهای نمونه name و salary را از کلاس والد به ارث می‌برد. علاوه بر این، کلاس فرزند یک متغیر نمونه دیگر به نام incentive دارد.

از تابع داخلی super() استفاده می‌کنیم که مرجعی به کلاس والد برمی‌گرداند و به کمک آن، سازنده کلاس والد را درون متد سازنده __init__() کلاس فرزند فراخوانی می‌کنیم.

class SalesOfficer(Employee):
   def __init__(self,nm, sal, inc):
      super().__init__(nm,sal)
      self.incnt=inc
   def getSalary(self):
      return self.salary+self.incnt

متد getSalary() بازنویسی شده است تا مقدار پاداش را به حقوق اضافه کند.

مثال

از کلاس والد و کلاس فرزند شیء ایجاد کنید و تأثیر بازنویسی متد را مشاهده کنید. کد کامل در ادامه آمده است:

class Employee:
   def __init__(self,nm, sal):
      self.name=nm
      self.salary=sal
   def getName(self):
      return self.name
   def getSalary(self):
      return self.salary

class SalesOfficer(Employee):
   def __init__(self,nm, sal, inc):
      super().__init__(nm,sal)
      self.incnt=inc
   def getSalary(self):
      return self.salary+self.incnt

e1=Employee("Rajesh", 9000)
print ("Total salary for {} is Rs {}".format(e1.getName(),e1.getSalary()))
s1=SalesOfficer('Kiran', 10000, 1000)
print ("Total salary for {} is Rs {}".format(s1.getName(),s1.getSalary()))

با اجرای این کد، خروجی زیر تولید می‌شود:

Total salary for Rajesh is Rs 9000
Total salary for Kiran is Rs 11000

متدهای قابل بازنویسی در کلاس پایه

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

شماره متد، توضیحات و نمونه فراخوانی

1

__init__ ( self [,args...] )

سازنده (با هر تعداد آرگومان اختیاری)

نمونه فراخوانی: obj = className(args)

2

__del__( self )

مخرب؛ یک شیء را حذف می‌کند.

نمونه فراخوانی: del obj

3

__repr__( self )

نمایش رشته‌ای که قابلیت ارزیابی و بازسازی شیء را دارد.

نمونه فراخوانی: repr(obj)

4

__str__( self )

نمایش رشته‌ای قابل چاپ از شیء

نمونه فراخوانی: str(obj)

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.