چندریختی در زبان پایتون چیست ؟
چندریختی در زبان پایتون چیست ؟
اغلب متدهایی که تا بهحال نوشتهایم تنها براي یک نوع مخصوص کار میکنند. وقتی کـه یـک شیء جدید میسازید، متدهایی مینویسید که روي آن نوع عمل میکنند. اما عملیات مشخصی وجود دارد که شما میخواهید بـر روي بسـیاري از انـواع انجـام دهیـد؛ از قبیل عملیات ریاضی که در بخش قبل دیدید. اگر انواع متعددي، یـک مجموعـه از عملیـات یکسـان را پشتیبانی کنند شما میتوانید توابعی بنویسید که بر روي هر کدام از آن انواع کار کنند. براي نمونه عملیات multadd) که در جبر خطی رایج است) سه پارامتر دریافت میکند، اولی را در دومی ضرب کرده سپس با سومی جمع میکند. مـا مـیتـوانیم آن را در پـایتون بـه ایـن صـورت بنویسیم:
def multadd (x, y, z):
return x * y + z
این متد براي هر مقدار x و y که بتوانند در هم ضرب شوند و براي هر مقـدار z کـه بتوانـد بـا حاصلضرب جمع شود کار خواهد کرد. ما میتوانیم آن را با مقادیر عددي احضار کنیم:
>> multadd (3, 2, 1)
7
یا با Pointها:
>> p1 = Point(3, 4)
>>> p2 = Point(5, 7)
>>> print multadd (2, p1, p2)
(11, 15)
>>> print multadd (p1, p2, 1)
44
در اولین مورد Point در یک عدد ضرب میشود و سپس با یک Point دیگر جمع میشـود و در دومین مورد حاصلضرب نقطهاي یک مقدار عددي را نتیجه میدهد، بنابراین پارامتر سوم هم باید یک مقدار عددي باشد. تابعی شبیه به این، که میتواند پارامترهایی با انواع مختلف را دریافت کند، چندریختی نامیده میشود. عنوان مثالی دیگر، متد frontAndBack را ملاحظه کنید که یک لیست را از اول به آخـر و معکوس چاپ میکند:
def frontAndBack(front):
import copy
back = copy.copy(front)
back.reverse()
print str(front) + str(back)
از آنجا که متد reverse یک تغییردهنده است، ما قبل از معکوس کردن لیست یـک copy از آن میسازیم. با این روش، متد لیستی را که به عنوان پارامتر وارد شده تغییر نمیدهد. در اینجا مثالی که frontAndBack را روي یک لیست بهکار میبرد ملاحظه میکنید:
>>> myList = [1, 2, 3, 4]
>>> frontAndBack(myList)
[1, 2, 3, 4][4, 3, 2, 1]
البته ما سعی کردیم این تابع را براي لیستها بهکار ببریم، لذا اگر ایـن متـد کـار کنـد موجـب شگفتی نیست. آنچه که ممکن است باعث تعجب شود آن است که ما بتوانیم متد را براي یک Point بهکار بریم. براي نعیین اینکه آیا یک تابع میتواند براي یک نوع جدید بهکار رود یا نه، ما از قوانین بنیـادي چندریختیها استفاده میکنیم: اگر همۀ عملیات درون یک تابع بتواند براي یک نوع بهکار رود تابع میتوانـد بـر روي آن نوع به کار گرفته شود. عملیات داخل متد شامل copy ،reverse و print هستند. copy بر روي هر شیء کار مـیکنـد و قـبلاً متـد __str __را هـم بـراي همـۀ Pointهـا نوشتهایم. حال تمام آنچه ما نیاز داریم نوشتن متد reverse در کلاس Point است:
def reverse(self):self.x , self.y = self.y, self.x
آنگاه میتوانیم Pointها را به frontAndBack بفرستیم:
>> p = Point(3, 4)
>>> frontAndBack(p)
(3, 4)(4, 3)
بهترین نوع چند شکلی نوع غیرعمدي اسـت؛ در جـائیکـه شـما درمـییابیـد تـابعی کـه قـبلاً نوشته اید میتواند براي نوعی که اصلاً طراحی نکردهاید هم بهکار رود.
برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید