ویدیو آموزش چند ریختی(polymorphism) در پایتون

امیرحسین بیگدلو April 2023

پیش نیاز: آموزش کلاس‌های abstract در پایتون

 

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

 

برای برنامه نویسی شی گرا در پایتون ، این بدان معناست که یک شی خاص متعلق به یک کلاس خاص می تواند به همان شیوه ای استفاده شود که گویی شیء متفاوتی متعلق به یک کلاس متفاوت است.

 

پلی مورفیسم امکان انعطاف پذیری و اتصال شل را فراهم می کند تا بتوان کد را به مرور گسترش و به راحتی حفظ کرد.

 

ایجاد کلاسهای چندریختی در پایتون

برای استفاده از چند ریختی ، ما قصد داریم دو کلاس مجزا برای استفاده با دو شی مجزا ایجاد کنیم. هر یک از این کلاسهای مجزا باید دارای یک رابط مشترک باشند تا بتوان از آنها به صورت چند شکل استفاده کرد ، بنابراین ما متدهایی را به آنها ارائه می دهیم که متمایز هستند اما دارای یک نام هستند.

 

ما یک کلاس Shark و یک کلاس Clownfish ایجاد می کنیم که هر کدام روش هایی برای swim() ، swim_backwards () و skeleton () تعریف می کنند.

class Shark():
    def swim(self):
        print("The shark is swimming.")

    def swim_backwards(self):
        print("The shark cannot swim backwards, but can sink backwards.")

    def skeleton(self):
        print("The shark's skeleton is made of cartilage.")


class Clownfish():
    def swim(self):
        print("The clownfish is swimming.")

    def swim_backwards(self):
        print("The clownfish can swim backwards.")

    def skeleton(self):
        print("The clownfish's skeleton is made of bone.")

 

در کد بالا ، کلاس Shark و Clownfish دارای سه متد با نام مشترک هستند. با این حال ، هر یک از ویژگی های این متدها برای هر کلاس متفاوت است.

 

بیایید این کلاسها را به دو شیء تبدیل کنیم:

...
sammy = Shark()
sammy.skeleton()

casey = Clownfish()
casey.skeleton()

 

وقتی برنامه را با دستور python polymorphic_fish.py اجرا می کنیم ، می بینیم که هر شیء همانطور که انتظار می رود رفتار می کند:

The shark's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.

 

اکنون که ما دو شی داریم که از یک رابط مشترک استفاده می کنند ، می توانیم از دو شیء بدون توجه به انواع آنها به طور یکسان استفاده کنیم.

مقاله پیشنهادی: استفاده از عملگر and در پایتون

چندریختی با متدهای کلاس

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

...
sammy = Shark()

casey = Clownfish()

for fish in (sammy, casey):
    fish.swim()
    fish.swim_backwards()
    fish.skeleton()

 

ما دو شی داریم ، sammy از کلاس Shark ، و casey از کلاس Clownfish. حلقه for ما از طریق این اشیا تکرار می شود و در هر یک از آنها روش های swim () ، swim_backwards () و () skeleton () را فراخوانی می کند.

 

وقتی برنامه را اجرا می کنیم ، خروجی به صورت زیر خواهد بود:

The shark is swimming.
The shark cannot swim backwards, but can sink backwards.
The shark's skeleton is made of cartilage.
The clownfish is swimming.
The clownfish can swim backwards.
The clownfish's skeleton is made of bone.

 

حلقه for ابتدا از طریق راه اندازی sammy از کلاس Shark ، سپس شیء casey از کلاس Clownfish تکرار می شود ، بنابراین ما ابتدا متدهای مربوط به کلاس Shark و سپس Clownfish را مشاهده می کنیم.

 

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

ویدیو پیشنهادی: ویدیو آموزش متدهای zip و enumerate در پایتون

چندریختی با فانکشن در پایتون

ما همچنین می توانیم یک تابع ایجاد کنیم که می تواند هر آبجکتی را بگیرد ، و امکان ایجاد چند شکلی را می دهد.

 

بیایید یک تابع به نام in_the_pacific () ایجاد کنیم که شیئی را که می توانیم fish نام ببریم در خود می گیرد. اگرچه ما از نام fish استفاده می کنیم ، هر شیء فوری می تواند به این تابع فراخوانی شود:

…
def in_the_pacific(fish):

 

در مرحله بعد ، ما تابع را برای انجام کارهایی که از شیء fish که به آن منتقل کرده ایم استفاده می کند. در این مورد ما متدهای swim () را می نامیم که هر کدام در دو کلاس Shark و Clownfish تعریف شده اند:

...
def in_the_pacific(fish):
    fish.swim()

 

در مرحله بعد ، ما نمونه هایی از هر دو کلاس Shark و Clownfish را ایجاد می کنیم ، اگر آنها را قبلاً نداریم. با استفاده از آنها ، می توانیم عمل آنها را با استفاده از یک تابع in_the_pacific () فراخوانی کنیم:

...
def in_the_pacific(fish):
    fish.swim()

sammy = Shark()

casey = Clownfish()

in_the_pacific(sammy)
in_the_pacific(casey)

 

وقتی برنامه را اجرا می کنیم ، خروجی به صورت زیر خواهد بود:

The shark is swimming.
The clownfish is swimming.

 

اگرچه هنگام تعریف یک شیء تصادفی (fish) را به تابع in_the_pacific () منتقل کردیم ، اما هنوز هم توانستیم از آن به طور موثر برای نمونه گیری از کلاس های shark و clownfish استفاده کنیم. شیء casey به نام روش swim () تعریف شده در کلاس Clownfish و شی sammy به نام swim () در کلاس Shark تعریف شده است.

اگر ویدیو بالا را دوست داشتید پیشنهاد میکنیم به مطالب زیر هم سر بزنید:

آموزش برنامه‌نویسی شی گرا در پایتون

دوره های آموزش پروژه محور و پیشرفته پایتون

دوره آموزش پایتون (python)

ویدیو انواع None در پایتون

ویدیوهای مشابه



ارسال نظر


راسد اعظمی

2 سال قبل پاسخ به نظر

خیلی مفید بود دست تان درد نکند امیر عزیز

ارسال نظر



عارف

3 سال قبل پاسخ به نظر

عالی بود مرسی

ارسال نظر



مونگارد