tgoop.com/lython/59
Create:
Last Update:
Last Update:
✅Polymorphism in python
از مهمترین بحثها در شئگرایی میشه به Polymorphism اشاره کرد. معنای این مفهوم یعنی که بتونیم از یک متد یکسان برای انواع آبجکتها استفاده کنیم. کد زیر خودش گویاست.
text = 'Hello World'
numbers = [1, 2, 3]
print(len(text)) # 11
print(len(numbers)) # 3
براش مهم نیست که چه نوعی به عنوان ورودی میگیره. صرفا داره کار خودش رو میکنه چون برای جفت این کلاسها متد len با توجه به نوع ورودی تعریف شده است و این همون چندریختی یا Polymorphism هستش. خب این قدرت پایتونه که انقدر خوب همه چیو داره هماهنگ میکنه.
اما در کل سه نوع روش پیاده سازی Polymorphism وجود دارد.
1- Method Overriding
2- Method Overloading
3- Operator Overloading
------------------------------
1-Method Overriding
فرض کنید که کلاس LittleFish از کلاس Animal ارثبری میکند. در اینصورت خواهیم داشت.
class Animal:
def breathe(self):
print("I breathe oxygen.")
def feed(self):
print("I eat food.")
class LittleFish(Animal):
def feed(self):
print("I eat plankton.")
نکتههای جالبی توی تکه کد بالاست. چون کلاس LittleFish از کلاس Animal ارثبری کرده پس متد feed جایگزین متد همنامی میشه که در کلاس والد موجوده. اما صرفا برای کلاس LittleFish به این شکل است و متد feed در کلاس LittleFish به اصطلاح Override شده است در مقایسه با متد feed در کلاس Animal. به کد زیر توجه کنید.
LittleFish().feed()اما همانطور که میبینید در سطح کلاس Animal هنوز متد feed همانی است که در آن تعریف شدهاست.
# I eat plankton.
LittleFish().breathe()
# I breathe oxygen.
Animal().feed()
# I eat food.
--------------------------
2-Method Overloading
حالا یه بحث دیگهای داریم تحت این عنوان بالا.
این توی پایتون پشتیبانی نمیشه. فرض کنیم توی کلاس Animal یه متد دیگه تحت عنوان breath تعریف میکنیم. مثال زیر رو ببینید.
class Animal:
def breathe(self):
print('I breathe oxygen.')
def breathe(self):
print('I breathe O2 + N2.')
درواقع اگر در یک کلاس دو متد همنام تعریف کنیم با این که اروری برنمیگردد ولی صرفا دومی فعال خواهد شد. مهم نیست که متد چکاری انجام میدهد صرفا نام متد است که باعث تمایز بین متدها میشود. همانطور که گفته شد این ویژگی در پایتون پشتیبانی نمیشود و متد اولی غیرفعال خواهد شد.
--------------------------
3- Operator Overloading
این ویژگی بسیار کاربردی و جالب است. درواقع این ویژگی اجازه میدهد که عملگرهای (+ - / و ... ) را برای کلاس های جدیدی که ایجاد میکنیم بازتعریف کنیم.
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
x = self.x +other.x
y = self.y + other.y
z = self.z + other.z
return Vector(x, y, z)
درواقع متد add که تعریف کردیم برای این کلاس مثل جمع برداری عمل میکند. در واقع عملگر + را برای کلاس وکتور تعریف کردیم. باز هم کد گویای مفهوم هست.
Vec1 = Vector(1, 2 ,3)
vec2 = Vector(1, 1, 1)
vec_add = vec1 + vec2
vec_add.x # 2
vec_add.y # 3
vec_add.z # 4
@lython
BY روزمرگی های یک برنامه نویس
Share with your friend now:
tgoop.com/lython/59