پلی مورفیسم در پایتون چیست؟ – توضیح به زبان ساده

۱۳۵ بازدید
آخرین به‌روزرسانی: ۱۶ اسفند ۱۴۰۲
زمان مطالعه: ۱۲ دقیقه
پلی مورفیسم در پایتون چیست؟ – توضیح به زبان ساده

هر چیزی در پایتون شی است. این جمله می‌تواند بسیار مبهم باشد مگر اینکه چند کلاس درباره برنامه‌نویسی کامپیوتر گذرانده باشید. خلاصه معنای این جمله بیان می‌کند که همه چیز درپایتون متدها و مقادیر خود را دارند. زیرا هر چیزی بر مبنای کلاس پایه‌گذاری شده است. کلاس‌ها طرح اولیه هر شیئی هستند. کلاس‌ها عناصر اصلی شی‌گرایی هستند و این عناصر باید طبق اصول خاصی طراحی و چیده شوند تا شی‌گرایی در بهترین حالت به هدف خود برسد. پلی مورفیسم در پایتون یکی از اصول چهارگانه‌ی شی‌گرایی است که بدون آن پیاده‌سازی این زبان ممکن نبود. اصولی که زبان برنامه‌نویسی پایتون به دلیل ماهیتش درپیاده‌سازی آن‌ها بسیار جدی است.

اصول چهارگانه‌ی شی‌گرایی عبارتند از «مفاهیم انتزاعی» (Abstraction)، «کپسوله‌سازی» (Encapsulation)، «وراثت» (Inheritance) و «چند ریختی» (Polymorphism)، پلی مورفیسم به عنوان یکی از مهمترین ویژگی‌های زبان‌های برنامه‌نویسی شی‌گرایی در نظر گرفته می‌شود. در این مطلب از مجله فرادرس به بررسی اصل پلی مورفیسم می‌پردازیم و مزایا و معایب آن را در کنار نحوه پیاده‌سازی شرح خواهیم داد. در ادامه به بررسی پلی مورفیسم به‌صورت اختصاصی در پایتون خواهیم پرداخت.

پلی مورفیسم در پایتون چیست؟

پلی مورفیسم در پایتون به استفاده از نام یکسان متدهای مختلف اشاره می‌کند. از این مفهوم به‌صورت وسیعی در کدنویسی با پایتون بر اساس اصول شی‌گرایی استفاده می‌شود. همانند بقیه زبان‌های برنامه‌نویسی شی‌گرا مثل Java و ++C، پلی مورفیسم در پایتون نیز به دلایل مختلفی پیاده‌سازی شده است.

بیشترین علت‌های پیاده‌سازی پلی مورفیسم Duck Typing، «سربارگذاری عملگر» (Operator Overloading)، «سربارگذاری متد» (Method Overloading) و «بازنویسی متد» (Method Overriding) هستند که در ادامه به بررسی و توضیح نحوه پیاده‌سازی هر یک خواهیم پرداخت. پیاده‌سازی پلی مورفیسم می‌تواند به دو روش اصلی محقق شود، «بازنویسی» (Overriding) و «سربارگذاری» (Overloading).

توضیحی درباره پلی مورفیسم در پایتون که به صورت یک نمودار درختی نمایش داده شده است کلاس در بالا و متد در پایین قرار دارد.

در ادامه به بررسی این دو روش اصلی خواهیم پرداخت.

چگونه از پلی مورفیسم استفاده کنیم؟

روش اول سربارگذاری یا «Overloading» است. به فرایند فراخوانی متدها یا عملگرهای دارای نام یکسان که پارامترهای متفاوتی می‌پذیرند سربارگذاری می‌گویند اما زبان برنامه‌نویسی پایتون، فن‌آوری سربارگذاری را پشتیبانی نمی‌کند. برای غلبه بر این مشکل متناسب با هر نوع سربارگذاری راه حل‌های خاصی هم وجود دارد. «Overloading» به دو نوع اصلی تقسیم می‌شود.

  • «سربارگذاری عملگر» (Operator Overloading)
  • «سربارگذاری متد» (Method Overloading)

سربارگذاری عملگر

سربارگذاری عملگر نوعی از سربارگذاری است که در آن عملگری را فراتر از وظیفه‌اش، برای پذیرش مسئولیت‌های بیشتر، به روش‌های مختلف Overload کنیم. برای مثال می‌توانیم عملگر +  را Overload کنیم تا روی اعداد int به خوبی رشته‌ها کار کند.

1class Test:
2 def add(self, a, b):
3  s = a + b
4  return s
5obj = Test()
6s = obj.add(10, 20)
7print("Sum is:", s)

خروجی کد بالا به صورت زیر می‌شود.

Sum is 30

عملگر +  وقتی که همراه با اعداد استفاده می‌شود، عمل جمع ریاضی را انجام می‌دهد اما وقتی که با عملوندهایی از جنس رشته مورد استفاده قرار می‌گیرد باید عمل «چسباندن» (Concatenate) رشته‌ها را بهم انجام د‌هد. این خود نمونه‌ای از عمل سربارگذاری متدها است که به‌صورت پیش‌فرض توسط توسعه‌دهندگان پایتون انجام شده است.

مار کوچک به عنوان نمادی از پایتون بر روی لپتاپ چمبره زده است.

سربارگذاری متدها

سربارگذاری متدها یا «Method Overloading» نوعی از سربارگذاری است و زمانی اتفاق می‌افتد که کلاسی چندین متد با نامی یکسان داشته باشد که پارامترهای‌ مختلفی را می‌پذیرند یا آرگومان‌های متفاوتی دارند. سربارگذاری متدها می‌تواند خوانایی برنامه را بیشتر کند. در واقع، پایتون از سربارگذاری متدها پشتیبانی نمی‌کند، اما راه‌های مختلفی وجود دارند که بتوانیم به مفهوم سربارگذاری متدها دست پیدا کنیم. اگرچه به‌صورت ظاهری سربارگذاری متدها بدون تکنیک خاصی قابل پیاده‌سازی است اما فقط متدهایی که آخر از همه تعریف شده‌اند را پایتون اجرا خواهد کرد.

1# First product method.
2# Takes two argument and print their
3# product
4
5
6def product(a, b):
7	p = a * b
8	print(p)
9
10# Second product method
11# Takes three argument and print their
12# product
13
14
15def product(a, b, c):
16	p = a * b*c
17	print(p)
18
19# Uncommenting the below line shows an error
20# product(4, 5)
21
22
23# This line will call the second product method
24product(4, 5, 5)

خروجی این کد به‌صورت زیر می‌شود.

100

در اینجا فقط متدی که در آخر کار تعریف شده است اجرا خواهد شد. فراخوانی متدی که در ابتدا تعریف شده، یعنی ارسال فقط دو پارامتر به متد باعث ایجاد خطا می‌شود. پس، برای اینکه مشکل بالا را حل کنیم می‌توانیم از روش‌های مختلفی استفاده کنیم که در ادامه به بررسی بعضی از این روش‌ها پرداخته‌ایم.

روش اول

می‌توانیم از آرگومان‌ها استفاده کنیم. باید همان تابع را مجبور بسازیم با هر نوع آرگومانی رفتار متفاوتی را در پیش گیرد. به مثال آمده‌ در پایین دقت کنید.

1# Function to take multiple arguments
2def add(datatype, *args):
3
4	# if datatype is int
5	# initialize answer as 0
6	if datatype == 'int':
7		answer = 0
8
9	# if datatype is str
10	# initialize answer as ''
11	if datatype == 'str':
12		answer = ''
13
14	# Traverse through the arguments
15	for x in args:
16
17		# This will do addition if the
18		# arguments are int. Or concatenation
19		# if the arguments are str
20		answer = answer + x
21
22	print(answer)
23
24
25# Integer
26add('int', 5, 6)
27
28# String
29add('str', 'Hi ', 'Geeks')

خروجی کد بالا به صورت زیر خواهد بود.

11
Hi Geeks

روش دوم

یکی از راه‌ها برای اینکه بتوانیم به تکنیک سربارگذاری متد در پایتون دست پیدا کنیم کمک گرفتن از تابعی است که با استفاده از کلمه کلیدی «None» به عنوان پارامتر پیش‌فرض توسط کاربر تعریف شده، برای درک بهتر باید مثالی را همراه با کد بررسی کنیم.

اولین پارامتر متد add  به مقدار None  تنظیم شده است. این اتفاق به ما امکان می‌دهد که متد را با مقدار پارامتر یا حتی بدون مقدار پارامتر فراخوانی کنیم. وقتی که آرگومان‌ها را به متد add  ارسال می‌کنیم فرایند کار به‌صورت زیر خواهد بود.

  • متد بررسی می‌کند که آیا هر دو پارامتر در دسترس‌ هستند یا نه.
  • از آنجا که قبلا به‌طور پیش فرض مقدار پارامترها را برابر با None  تنظیم کرده‌ایم، اگر هیچ کدام از مقادیر ارسال نشده باشند در تابع به‌صورت None  باقی‌ می‌ماند.
  • با استفاده از عبارت‌های شرطی If-else و بررسی هر پارامتر به عنوان مقداری مجزا، می‌توانیم فرایند «سربارگذاری متد» (Method Overloading) را در پایتون شبیه سازی کنیم.

به نمونه کدی از مثال بالا که در پایین آورده‌ایم توجه کنید.

1# code
2def add(a=None, b=None):
3	# Checks if both parameters are available
4	# if statement will be executed if only one parameter is available
5	if a != None and b == None:
6		print(a)
7	# else will be executed if both are available and returns addition of two
8	else:
9		print(a+b)
10
11
12# two arguments are passed, returns addition of two
13add(2, 3)
14# only one argument is passed, returns a
15add(2)

خروجی این کد به صورت زیر می‌شود.

5
2

مشکل اصلی که در روش بالا وجود دارد این است که این روش، کدها را با استفاده از چندین عبارت شرطی if-else   بسیار پیچیده می‌کند و راه‌کار مطلوبی برای دسترسی به سربارگذاری متدها نیست.

روش سوم

استفاده از دکوریتور «ارسال چندگانه» (Multiple Dispatch) یکی از بهترین راه‌ها است که البته به روش مخصوص به خود نیاز دارد. باید در ابتدا کتابخانه مربوط به این دکوریتور «Multiple Dispatch» را بر روی سیستم خود با کمک کد زیر نصب کنید.

pip3 install multipledispatch

روش استفاده از این دکوریتور را در کد زیر نمایش داده‌ایم.

1from multipledispatch import dispatch
2
3# passing one parameter
4
5
6@dispatch(int, int)
7def product(first, second):
8	result = first*second
9	print(result)
10
11# passing two parameters
12
13
14@dispatch(int, int, int)
15def product(first, second, third):
16	result = first * second * third
17	print(result)
18
19# you can also pass data type of any value as per requirement
20
21
22@dispatch(float, float, float)
23def product(first, second, third):
24	result = first * second * third
25	print(result)
26
27
28# calling product method with 2 arguments
29product(2, 3) # this will give output of 6
30
31# calling product method with 3 arguments but all int
32product(2, 3, 2) # this will give output of 12
33
34# calling product method with 3 arguments but all float
35product(2.2, 3.4, 2.3) # this will give output of 17.985999999999997

خروجی کد بالا به‌صورت زیر می‌باشد.

6
12
17.985999999999997

«توزیع کننده» (Dispatcher) در بکند کد، شیئی ایجاد می‌کند که پیاده‌سازی‌های گوناگونی از هر متد را می‌تواند در خود ذخیره کند و در زمان اجرا، متد مناسب را با توجه به نوع و تعداد پارامترهای ارسال شده از بین متدهای تعریف شده فراخوانی کند.

بازنویسی متدها

«بازنویسی متد» (Method Overriding) توانایی مهمی برای هر زبان برنامه‌نویسی شی‌گرایانه است. باعث می‌شود زیرکلاس‌ها یا کلاس‌های فرزند بتوانند از متدی که توسط کلاس‌های مرجع یا والدشان پیاده‌سازی شده و به آن‌ها به ارث رسیده است، پیاده‌سازی مخصوص به خود و متناسب با نیازهای خود انجام دهند. وقتی که متدی در کلاس فرزند نام یکسان، پارامترها یا امضای یکسان و نوع داده برگشتی یکسانی با متدی در کلاس والد خود داشته باشد به اصطلاح می‌گوییم که این متد از متد کلاس مرجع خود بازنویسی شده است.

پیر مرد کت شلوار پوش با تعجب در مورد کدهای نوشته شده فکر می‌کند.

برای دیدن نمونه‌ای از توضیح بالا لطفا به مثالی که در ادامه آمده، توجه کنید.

1class Vehicle:
2  def run(self):
3    print("Saves Energy")
4 
5class EV(Vehicle):
6  def run(self):
7    super().run()
8    print("Run on Electricity")
9 
10
11ev = EV()
12ev.run()

خروجی کد بالا به این صورت می‌شود.

Saves Energy
Run on Electricity

تفاوت بین وراثت و بازنویسی متدها در چیست؟

وراثت این امکان را فراهم می‌کند که کلاسی تعریف کنیم که همه قابلیت‌های کلاس پدر را به ارث می‌برد و اجازه می‌دهد که قابلیت‌های بیشتری نیز اضافه کنیم. به‌سادگی توسط تعریف کردن متدی در کلاس فرزند که هم‌نام با متدی در کلاس والد است، بازنویسی متد اتفاق می‌افتد. وقتی که متدی در کلاس فرزند تعریف می‌کنید، به این متد دوم اجازه می‌دهید که هنگام فراخوانده شدن، وارد عمل شود و نیازی به استفاده از پیاده‌سازی‌های متد موجود در کلاس والد نداشته باشد.

Duck Typing

واژه «Duck Typing» از نقل قولی مشتق شده که می‌گوید «چیزی که مثل اردک راه برود، مثل اردک کووَک کووَک کند و مثل اردک شنا کند، حتما اردک است.». به عبارت ساده‌تر، چیزی که رفتارش را با چیز دیگر سازگار می‌کند در دسته‌بندی مربوط به همان چیز دیگر در نظر گرفته می‌شود. «Duck Typing» نوع سیستم استفاده شده در زبان‌های برنامه‌نویسی پویا است. برای مثال Python و Perl و Ruby و PHP و Javascript و غیره جزو زبان‌های برنامه‌نویسی پویا هستند. در اینجا، اهمیت خود متد تعریف شده از نوع کلاس مربوط به شیء بیشتر است. به‌خواطر استفاده از Duck Typing، دیگر نوع کلاس‌ها را بررسی نمی‌کنیم در عوض بررسی می‌کنیم که ببینیم آیا متد یا ویژگی خاصی در شی وجود دارد یا نه.

به هرحال می‌توان پلی مورفیسم را در پایتون به روش‌های گوناگونی پیاده‌سازی کرد که «Duck Typing» هم یکی از آن‌ها است. برای درک بهتر «Duck Typing» لطفا به مثال زیر توجه کنید.

1class Bird:
2  def fly(self):
3    print("fly with wings")
4  
5class Airplane:
6  def fly(self):
7    print("fly with fuel")
8  
9class Fish:
10  def swim(self):
11    print("fish swim in sea")
12  
13# Attributes having same name are
14# considered as duck typing
15for obj in Bird(), Airplane(), Fish():
16  obj.fly()

خروجی متد بالا به‌صورت زیر می‌شود.

fly with wings
fly with fuel
Error('Fish' object has no attribute 'fly')

مزایا و معایب پلی مورفیسم

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

مزایای استفاده از پلی مورفیسم در پایتون چیست؟

پلی مورفیسم در پایتون مزایای زیادی به سبک برنامه‌نویسی شی‌گرایانه داده‌ است که تقریبا می‌توان گفت یکی از اصولی است که عدم استفاده از آن، بکاربردن برنامه‌نویسی شی‌گرایانه را بی‌فایده می‌کند. در ادامه تعدادی از مزایای این قائده‌ی برنامه‌نویسی را آورده‌ایم.

  • به برنامه‌نویس کمک می‌کند که از کدها دوباره استفاده کند. می‌توان در هرجای برنامه که لازم باشد از کلاس‌هایی که یکبار نوشته، آزمایش و در آخر پیاده‌سازی شده‌اند، دوباره استفاده کرد که این خود باعث صرفه‌جویی زیاد در زمان می‌شود.
  • یک متغیر را به تنهایی می‌توان برای ذخیره‌سازی چندین نوع داده استفاده کرد.
  • خطایابی کدها بسیار ساده‌تر می‌شود.
  • «سربارگذاری متد» (Method Overriding) می‌تواند برای Builder-ها گسترش داده‌ شده باشد تا روش‌های مختلفی را برای مقداردهی اولیه به اشیا کلاس‌ها در اختیار داشه باشند.
  • بدون احتیاج به کامپایل دوباره برای اجازه دادن به باز استفاده از کدها، Method Overriding همراه با وراثت کار می‌کند.
نماد پایتون بر روی میزکاری قرار داده شده و مقدار بسیار زیادی از انواع قطعات فیزیکی به دور آن چیده شده اند - پلی مورفیسم در پایتون

معایب استفاده از پلی مورفیسم در پایتون چیست؟

پلی مورفیسم در پایتون همان‌طور که مزایایی بسیاری برای برنامه‌نویسان فراهم می‌کند، معایبی نیز دارد که در ادامه به بیان بعضی از آن‌ها خواهیم پرداخت.

  • یکی از اصلی‌ترین معایب چند ریختی این است که توسعه‌دهندگان پیاده‌سازی پلی مورفیسم در کدها را سخت و پیچیده می‌دانند.
  • پلی مورفیسم در زمان اجرا می‌تواند باعث ایجاد مشکلاتی در کارایی سیستم شود. در زمانی که سیستم باید تصمیم بگیرد چه متد یا متغییری باید فراخوانده شود. به‌طور کلی به‌دلیل تصمیماتی که در زمان اجرا گرفته می‌شود، عملکرد برنامه را کاهش می‌دهد.
  • چند ریختی قابلیت خوانایی برنامه را کاهش می‌دهد. برای شناسایی زمان دقیق اجرا لازم است که کسی رفتارهای زمان اجرای برنامه را شناسایی کند.

چرا به استفاده از پلی مورفیسم نیاز داریم؟

وقتی که درباره برنامه‌نویسی شی‌گرایانه در پایتون صحبت می‌شود، بدون تردید واژه پلی مورفیسم هم استفاده خواهد شد. در برنامه‌نویسی شی‌گرایانه، اشیا نیاز دارند که ساختارهای متفاوتی را بپذیرند. این ویژگی در توسعه‌ برنامه‌نویسی وجود دارد. فعالیت انفرادی می‌تواند به واسطه پلی مورفیسم به صورت متفاوتی اجرا شود.

وقتی که درباره متصل کردن کلاس‌ها به هم برای کار کردن به شکل عالی، اضافه کردن چیزهایی که مورد نیاز است بدون اینکه کدها را پیچیده‌تر کنیم و درباره استفاده از «رابط‌ها» (Interfaces) بخواهیم صحبت کنیم، به‌طور گسترده‌ای از این ایده استفاده می‌کنیم. پلی مورفیسم در پایتون مزایایش را در اختیارتان قرار می‌دهد به شرطی که واقعا به پلی مورفیسم احتیاج داشته باشید در غیر این صورت فقط کدهایتان را پیچیده‌تر می‌کند. پلی مورفیسم فقط وقتی مفید است که به‌طور اختصاصی به آن نیاز داشته باشید. یعنی بخواهید متدی یا عملگری را دقیقا مطابق نیازتان بازنویسی کنید.

مثالی برای درک نیاز به پلی مورفیسم

«تخصصی‌سازی» (Specialization) واژه مرکزی این اصل است که به اصطلاح «طبقه‌بندی» (Taxonomy) نیز نامیده می‌شود، به دسته‌بندی موجودات بر فرض مثال حشرات اشاره می‌کند، نمونه بسیار عالی است.

عده ای دانشجو در کلاس درس مشغول مطالعه درباره تخصصی سازی روی تصویر یاخته‌های درونی بدن هستند.

طبقه‌بندی خودرو به‌صورت عام می‌تواند همزمان شامل خودروهای برقی و دیزلی باشد. تنها چیزی که دارید سوخت است و توقع دارید که بدانید آیا سوخت به اندازه کافی برای زمانی که خودرو را روشن می‌کنید تا به مقصد برسید، وجود دارد یا نه. واژه خاص و مهم بعدی ما «توقع» (Expectation) است.

ایده فوق‌العاده‌ای است که قبل از شروع به کار، همیشه در ابتدا به طراحی دیاگرام ER یا «ارتباط موجودیت» (Entity Relationship) برنامه‌ای بپردازید که قرار است پیاده‌سازی کنید. به این دلیل که باید حدس بزنید چه نوع از موجودیت‌هایی قرار است ایجاد شوند و به کمک شناسایی رفتارهای شبیه بهم موجودیت‌ها، می‌توانید تعداد خطوط بسیار زیادی کد صرفه‌جویی کنید، البته اگر از عهده انجام این کار -طراحی دیاگرام- به اندازه کافی برآیید.

البته توجه کنید که صرفه‌جویی در کد تنها مزیت پروژه‌های موفق نیست.

پلی مورفیسم همراه با وراثت

پلی مورفیسم در پایتون، متدهایی را در کلاس فرزند تعریف می‌کند که همنام این متدها در کلاس‌های والد این فرزندان نیز موجود است. در «وراثت» (Inheritance)، کلاس فرزند، متدها را از کلاس والد به ارث می‌برد. پس این امکان وجود دارد که متدی را که از کلاس والد به ارث رسیده است در کلاس فرزند تغییر دهیم.

پلی مورفیسم بیشترین مورد استفاده را در زمانی دارد که متدی که از کلاس والد به ارث رسیده با کلاس فرزند و وظایفش همخوانی نداشته باشد. به این فرایند دوباره پیاده‌سازی متدی که به ارث رسیده است در کلاس فرزند، «بازنویسی متد» (Method Overriding) می‌گویند. در ادامه مثالی برای نمایش دادن پلی مورفیسم در پایتون همراه با وراثت آورده‌ایم.

1class Tomato(): 
2     def type(self): 
3       print("Vegetable") 
4     def color(self):
5       print("Red") 
6class Apple(): 
7     def type(self): 
8       print("Fruit") 
9     def color(self): 
10       print("Red") 
11      
12def func(obj): 
13       obj.type() 
14       obj.color()
15        
16obj_tomato = Tomato() 
17obj_apple = Apple() 
18func(obj_tomato) 
19func(obj_apple)

خروجی مثال بالا به این شکل می‌شود.

Vegetable
Red
Fruit
Red

پلی مورفیسم ایستا و پلی مورفیسم پویا

در جایی که پیاده‌سازی دوباره متد یا عملگر، انتخاب شده است به‌صورتی که در ادامه بیان کرده‌ایم پلی مورفیسم تعریف می‌شود. پلی مورفیسم به دو دسته پیوسته و پویا تقسیم می‌شود. این طبقه‌بندی فقط بر حسب «ارسال ایستا» و «ارسال پویا» انجام شده است و همین‌طور به‌ترتیب، پلی مورفیسم ایستا و پلی مورفیسم پویا نیز به عنوان حالت‌های مرتبط پلی مورفیسم در نظر گرفته می‌شود. وقتی که کار اضافی برای انجام در زمان اجرا وجود نداشته باشد «پلی مورفیسم ایستا» (Static Polymorphism) گزینه‌ آسانتری است. اما برای پیاده‌سازی شرایط مختلف احتمالی، ممکن است مجبور به نوشتن کدهای بیشتری باشید. به علاوه، پلی مورفیسم ایستا اجازه می‌دهد که همه چیز را قبل از شروع به کار به دقت بررسی کنید.

«پلی مورفیسم پویا» (Dynamic Polymorphism) زمانی مفید است که بخواهید از متدها یا متغیرها استفاده کنید، بدون اینکه در ابتدای کار درباره آن‌ها چیزی بدانید. مانند کتابخانه‌ها که تقریبا بدون اینکه درباره نحوه عملکردشان چیزی بدانیم از توابع و عملگرهایشان استفاده می‌کنیم. روش پلی مورفیسم پویا بسیار قابل اطمینان‌تر است اما ممکن است کمی کندتر عمل کند. پلی مورفیسم پویا استفاده از Duck Typing را هموار می‌کند.

در مسائل مربوط به پلی مورفیسم پارامتری یا «موقتی» (Ad hoc)، اغلب موارد «پلی مورفیسم ایستا» (Static Polymorphism) ظاهر می‌شود. این کار مثل این است که از قبل برای برخورد با مسئله برنامه‌ریزی کرده باشید اما در مسائلی که مربوط به «پلی مورفیسم زیرمجموعه‌ای» (Subtype Polymorphism) است معمولا از «پلی مورفیسم پویا» (Dynamic Polymorphism) استفاده می‌شود، این روش کدنویسی مانند حل کردن مسائل با توجه به اتفاقات پیش رو است.

به طور خلاصه، در پلی مورفیسم Ad hoc و Parametric، برنامه‌نویس قبل از زمان اجرا تصمیمات را می‌گیرد ولی در پلی مورفیسم زیرمجموعه‌ای، تصمیمات در زمان اجرا اتخاذ می‌شود و برنامه به صورت پویا با توجه به شرایط عمل می‌کند.

به هرحال، با گرایش به الگوی برنامه‌نویسی «Metaprogramming»، درواقع می‌توانید پلی مورفیسم ایستا را به کمک «Subtyping» انجام دهید. مانند کمک گرفتن از حرکات هوشمندانه‌ای برای وادار کردن کامپیوتر را به انجام خواسته‌های خود است. استفاده از پلی مورفیسم ایستا به همراه کتابخانه‌های پویا معمولا چالشی خواهد بود زیرا زمانی که پلی مورفیسم از طریق ماژولی استفاده شود، فهمیدن نوع اشیائی درگیر برنامه دشوار خواهد شد. حداقل تا زمانی که شی مورد نظر ساخته شود.

تصویری ساده و حداقلی از محیط مار پایتون با تأکید بر دستور زبانی تمیز و خوانا

بعضی زبان‌های برنامه‌نویسی مانند ++C و Rust از قالب‌های «تک‌ریختی» (Monomorphism) استفاده می‌کنند اما زبان برنامه‌نویسی Swift به‌طور گسترده از «ارسال پویا» (Dynamic Dispatch) برای ساخت «رابط‌» (Interface) باینری به‌منظور بکاربردن در برنامه‌های کربردی این کتابخانه‌ها استفاده می‌کند. با پذیرش انجام کارهای بیشتر در زمان اجرای برنامه، می‌توانید کاری کنید که برنامه فضای کمتری را اشغال کند و منابع کمتری نیز برای مصرف نیاز داشته باشد.

فواید زیر را با استفاده از پلی مورفیسم بدست خواهید آورد.

  • در زمان اجرای برنامه پردازش کدها با سرعت بیشتری انجام خواهد شد.
  • کد زمان اجرا راندمان کاری بالاتری خواهد داشت.
  • کد بیشتری در اختیار خواهید داشت که به صورت ماژولار خواهد بود و قابلیت استفاده دوباره بیشتری خواهد داشت.
  • کد به شکلی خواهد بود که توسط گروه‌های دیگری از توسعه‌دهندگان هم قابل گسترش باشد.

سوالات متداول

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

پلی مورفیسم چیست؟

پلی مورفیسم توانایی اشیای مختلف برای پاسخگویی به متد یا تابعی یکسان است. این توابع اشیا مختلف را به یک روش فراخوانی می‌کنند. پلی مورفیسم مفهومی زیربنایی در برنامه‌نویسی شی‌گرایانه است.

Method Overriding چیست؟

سربارگذاری متد به کلاس‌های فرزند اجازه می‌دهد روی متدهایی که از کلاس‌های والد به ارث برده‌اند، پیاده‌سازی مخصوص به خود را اجرا کنند. این روش کدنویسی رفتارهای پویا را با توجه به کلاس مرجع هر شی ممکن می‌کند.

جمع بندی

در این مطلب از مجله فرادرس درباره پلی مورفیسم در پایتون، اصول اساسی پلی مورفیسم و نحوه پیاده‌سازی این اصول توضیح دادیم. پلی مورفیسم به عنوان هنر انعطاف‌پذیری پویا در کد نویسی به توسعه‌دهندگان پایتون این قدرت را می‌دهد کدهایی بنویسند که همزمان با سازگاری با حیطه‌های گوناگونی از مسائل حتی بتوانند بهترین عملکردها را نیز ارائه دهند.

خلاصه اینکه پلی مورفیسم فقط مفهومی محض در پایتون نیست بلکه ابزار قدرتمندی در دسترس شما است. کمک می‌کند که در زمینه‌های مختلفی بهترین عملکرد خودتان را ارائه بدهید و به کدهای خود انعطاف‌پذیری، نظم و آراستگی دهید. برای توسعه‌دهندگان زبان برنامه‌نویسی پایتون که به دنبال درگیرشدن با چالش‌های پیچیده هستند و میل دارند که به بهترین صورت از پس این وظایف برآیند، حرفه‌ای شدن در استفاده از پلی مورفیسم ضروری است.

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
MediumPython101InnovationYourselfGeeksforGeeks
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *