آموزش وراثت و چند شکلی در برنامه نویسی شی گرا در پایتون

3 سال پیش
آموزش وراثت و چند شکلی در برنامه نویسی شی گرا در پایتون

آموزش وراثت و چند شکلی در برنامه نویسی شی گرا در پایتون

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

پیشنهاد ویژه : پکیج آموزش صفر تا صد پایتون

وراثت و چند شکلی (چند ریختی) – این یک مفهوم بسیار مهم در پایتون است. اگر می خواهید یاد بگیرید، باید آن را به خوبی درک کنید.

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

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

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

در اصطلاحات برنامه نویسی شی گرا وقتی کلاس X کلاس Y را گسترش می دهد ، Y را کلاس super/parent/base و X را کلاس زیر کلاس/child/derived می نامند. نکته ای که در اینجا باید به آن توجه شود این است که فقط فیلدهای داده و روش هایی که خصوصی نیستند توسط کلاس های کودک قابل دسترسی است. فیلدها و روشهای داده خصوصی فقط در داخل کلاس قابل دسترسی است.

نحو برای ایجاد یک کلاس مشتق شده است –

class BaseClass:
   Body of base class
class DerivedClass(BaseClass):
   Body of derived class

 

 

ویژگی های وراثت

حالا به مثال زیر نگاه کنید –

Inheriting Attributes
خروجی

Inheriting Attributes Output

ما ابتدا یک کلاس به نام Date ایجاد کردیم و شی را به عنوان یک آرگومان ارسال کردیم، در اینجا شیء ساخته شده توسط پایتون است. بعداً کلاس دیگری به نام time ایجاد کردیم و کلاس Date را به عنوان آرگومان نامیدیم. از طریق این فراخوانی به همه داده ها و ویژگی های کلاس Date در کلاس Time دسترسی پیدا می کنیم. به همین دلیل وقتی سعی می کنیم متد get_date را از شیء Time Time که قبلاً ایجاد کرده ایم دریافت کنیم.

سلسله مراتب Object.Attribute 

  • نمونه
  • کلاس
  • هر کلاسی که این کلاس از آن ارث می برد

مثال هایی از وراثت

بیایید نگاهی اجمالی به مثال وراثت بیندازیم –

Inheritance Example
بیایید چند کلاس برای شرکت در مثال ها ایجاد کنیم –

  • Animal  – کلاس حیوان را شبیه سازی می کند
  • Cat – زیر کلاس حیوانات
  • Dog – زیر کلاس حیوانات

در پایتون سازنده کلاس برای ایجاد یک شی (مثال) ، و تعیین مقدار برای ویژگی ها استفاده می کرد.

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

Python Constructor
خروجی

Python Constructor Output

 

در مثال بالا، ما ویژگی ها یا روش های فرمان را که در کلاس والد قرار می دهیم می بینیم تا همه زیر کلاس ها یا کلاس های فرزند آن ویژگی را از کلاس والد به ارث ببرند.

اگر یک زیر کلاس سعی کند روش ها یا داده ها را از یک زیر کلاس دیگر به ارث برده باشد ، همانطور که می بینیم وقتی کلاس Dog سعی می کند متدهای ()swatstring  را از آن کلاس cat فراخوانی کند، با خطا مواجه می شود، خطایی (مانند AttributeError در مورد ما) ایجاد می کند.

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

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

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

چند شکلی یا پلی مورفیسم را می توان از طریق وراثت انجام داد، در حالی که زیر کلاسها از روشهای کلاس پایه استفاده می کنند یا آنها را لغو می کنند.

اجازه دهید مفهوم چند شکلی را با مثال وراثت قبلی خود درک کرده و یک روش معمول به نام show_affection را در هر دو زیر کلاس اضافه کنید –

از نمونه ای که می توانیم ببینیم، به طرحی اشاره می کند که در آن شیء از نوع متفاوت می تواند به همان شیوه یا به طور خاص دو یا چند کلاس با متد یک نام یا رابط مشترک به دلیل روش مشابه (نمایش_عاطفه در مثال زیر) رفتار شود. با هر دو نوع شیء فراخوانی می شود.

Polymorphism
خروجی

Polymorphism Output

بنابراین، همه حیوانات محبت نشان می دهند، اما آنها متفاوت هستند. رفتارهای show_affection (“نشان دادن_عاطفه”) چند شکلی است به این معنا که بسته به حیوان متفاوت عمل می کند. بنابراین ، مفهوم انتزاعی “حیوان” در واقع “نشان دادن محبت” نیست، اما حیوانات خاص (مانند سگ و گربه) اجرای ملموسی از عمل “نشان دادن_عاطفه” دارند.

خود پایتون دارای کلاس هایی است که چند شکل هستند. به عنوان مثال ، تابع ()len می تواند با چندین شی مورد استفاده قرار گیرد و همه بر اساس پارامتر ورودی خروجی صحیح را برمی گردانند.

Polymorphic

 

Overriding

در پایتون، هنگامی که یک زیر کلاس حاوی متدی است که متد فوق کلاس را نادیده می گیرد ، می توانید با فراخوانی متد superclass نیز فراخوانی کنید.

 

مثال

class Thought(object):
   def __init__(self):
      pass
   def message(self):
      print("Thought, always come and go")

class Advice(Thought):
   def __init__(self):
      super(Advice, self).__init__()
   def message(self):
      print('Warning: Risk is always involved when you are dealing with market!')

 

به ارث بردن سازنده

اگر از مثال وراثت قبلی خود می بینیم ، __init__ در کلاس والدین در روش بالا قرار داشت زیرا سگ یا گربه کلاس کودک در آن __init__ کلاس نداشت. پایتون از ویژگی وراثت برای یافتن __init__ در کلاس حیوانات استفاده کرد. وقتی کلاس کودک را ایجاد کردیم، ابتدا روش __init__ در کلاس سگ به نظر می رسد، سپس آن را پیدا نکرد، سپس در کلاس والد Animal نگاه کرد و آنجا را پیدا کرد و آن را فراخوانی کرد. بنابراین با پیچیده شدن طراحی کلاس ما ، ممکن است بخواهیم یک نمونه را ابتدا از طریق سازنده کلاس والد و سپس از طریق سازنده کلاس کودک آغاز کنیم.

Constructor
خروجی

Constructor Output

 

در مثال بالا- همه حیوانات نام دارند و همه سگها نژاد خاصی دارند. ما کلاس کلاس والد را با super صدا کردیم. بنابراین سگ __init__ خاص خود را دارد اما اولین چیزی که اتفاق می افتد این است که ما Super را فراخوانی می کنیم. Super یک تابع تو کار است و طوری طراحی شده است که یک کلاس را به super class خود یا کلاس اصلی مربوط کند.

در این مورد ما می گوییم که super class سگ را دریافت کنید و مثال سگ را به هر روشی که در اینجا می گوییم سازنده __init__ منتقل کنید. بنابراین به عبارت دیگر ما کلاس والد را __Animal __init با شی سگ فراخوانی می کنیم. ممکن است بپرسید چرا ما فقط با نمونه سگ __Animal __init نمی گوییم، می توانیم این کار را انجام دهیم اما اگر نام کلاس حیوانات تغییر کند باید سلسله مراتب کلاس را از نو تنظیم کنیم که سگ از یک کلاس دیگر به ارث برده است. استفاده از super در این مورد به ما اجازه می دهد تا چیزها را مدولار نگه داریم و تغییر و نگهداری آنها آسان است.

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

نتیجه

  • __init__ مانند هر روش دیگری است. می توان آن را به ارث برد
  • اگر یک کلاس سازنده __init__ نداشته باشد، پایتون کلاس والد خود را بررسی می کند تا ببیند آیا می تواند یک کلاس پیدا کند.
  • به محض پیدا کردن یکی، پایتون آن را فراخوانی می کند و دیگر جستجو نمی کند
  • ما می توانیم از تابع ()super برای فراخوانی متدها در کلاس والد استفاده کنیم.
  • ممکن است بخواهیم در کلاس والد و همچنین کلاس خودمان مقداردهی اولیه کنیم.

 

آموزش وراثت چندگانه و درخت جستجو

همانطور که از نام آن مشخص است، وراثت چندگانه پایتون است هنگامی که یک کلاس از چندین کلاس ارث می برد.

به عنوان مثال، کودک ویژگی های شخصیتی را از هر دو والدین (مادر و پدر) به ارث می برد.

آموزش نحو وراثت چندگانه پایتون

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

در زیر نمونه ای از آن وجود دارد –

>>> class Mother:
   pass

>>> class Father:
   pass

>>> class Child(Mother, Father):
   pass

>>> issubclass(Child, Mother) and issubclass(Child, Father)
True

 

وراثت چندگانه به توانایی وراثت از دو یا چند کلاس اشاره دارد. این پیچیدگی زمانی ایجاد می شود که فرزند از والدین و والدین از طبقه پدربزرگ و مادربزرگ ارث می برند. پایتون از درخت ارثی بالا می رود و به دنبال ویژگی هایی است که درخواست می شود از یک شیء خوانده شود. در نمونه، داخل کلاس سپس کلاس والدین و در آخر کلاس پدربزرگ و مادربزرگ را بررسی می کند. اکنون این سوال مطرح می شود که کلاسها به چه ترتیبی جستجو می شوند-breath-first یا depth-first. به طور پیش فرض، پایتون با depth-first کار می کند.

به همین دلیل است که در نمودار زیر پایتون ابتدا روش ()dothis را در کلاس A جستجو می کند. بنابراین ترتیب وضوح روش در مثال زیر خواهد بود

Mro- D → B → A → C

به نمودار وراثت چندگانه زیر توجه کنید –

Multiple Inheritance
بیایید یک مثال را برای درک ویژگی “mro” پایتون مرور کنیم.

خروجی

Python mro Feature Output
مثال ۳

بیایید یک مثال دیگر از وراثت چندگانه “شکل الماس” را در نظر بگیریم.

Diamond Shape Multiple Inheritance
نمودار فوق مبهم در نظر گرفته خواهد شد. از مثال قبلی ما درک ” روش ترتیب وضوح” (“method resolution order”) صورت می گیرد، یعنی. mro D → B → A → C → A خواهد بود اما اینطور نیست. با بدست آوردن A دوم از C ، پایتون A. قبلی را نادیده می گیرد ، بنابراین mro در این حالت D → B → C → A خواهد بود.

بیایید یک مثال بر اساس نمودار بالا ایجاد کنیم –

Method Resolution Order
خروجی

Method Resolution Order Output

پیک قاعده ساده برای درک خروجی فوق این است- اگر همان کلاس در ترتیب وضوح روش ظاهر شود ، ظاهرهای قبلی این کلاس از روش ترتیب وضوح حذف می شود.

  • نتیجه گیری –
  • هر کلاس می تواند از چندین کلاس ارث ببرد
  • پایتون معمولاً هنگام جستجو در کلاسهای ارثی از دستور “depth-first” استفاده می کند.
  • اما وقتی دو کلاس از یک کلاس ارث می برند ، پایتون اولین ظاهرهای آن کلاس را از mro حذف می کند.

 

آموزش دکوراتورها، متد های استاتیک و کلاس

توابع (یا روش ها) توسط دستور def ایجاد می شوند.

اگرچه متدها دقیقاً مشابه یک تابع عمل می کنند به جز یک نقطه که در آن اولین آرگومان متد نمونه است.

ما می توانیم روش ها را بر اساس نحوه رفتار آنها طبقه بندی کنیم ، مانند

روش ساده – خارج از کلاس تعریف می شود. این تابع می تواند با استفاده از آرگومان نمونه به ویژگی های کلاس دسترسی پیدا کند:

def outside_func(():

 

  • روش نمونه –
def func(self,)

 

  • روش کلاس – در صورت نیاز به استفاده از ویژگی های کلاس
classmethod
def cfunc (cls،)

 

  • روش استاتیک – هیچ اطلاعاتی در مورد کلاس ندارید
staticmethod
def sfoo ()

 

تا کنون ما روش نمونه را مشاهده کرده ایم ، اکنون زمان آن است که در مورد دو روش دیگر بینشی داشته باشیم ،

روش کلاس

دکوراتور classmethod@، یک تزئین کننده تابع داخلی است که از کلاس موردنظر یا کلاس نمونه ای که به عنوان اولین آرگومان نامیده می شود، عبور می کند. نتیجه این ارزیابی بر تعریف عملکرد شما سایه می اندازد.

class C(object):
   @classmethod
   def fun(cls, arg1, arg2, ...):
      ....
fun: function that needs to be converted into a class method
returns: a class method for function

 

آنها به این استدلال cls دسترسی دارند، نمی تواند حالت نمونه شی را تغییر دهد. که مستلزم دسترسی به خود است.

  • محدود به کلاس است و نه هدف کلاس.
  • متدهای کلاس همچنان می توانند حالت کلاس را که در همه موارد کلاس اعمال می شود ، تغییر دهند.

 

روش استاتیک

یک متد استاتیک نه یک پارامتر self و نه یک cls (کلاس) را نمی گیرد ، اما پذیرفتن تعداد دلخواه دیگر پارامترها آزاد است.

class C(object):
   @staticmethod
   def fun(arg1, arg2, ...):
   ...
returns: a static method for function funself.

 

  • یک متد استاتیک نمی تواند حالت شی و حالت کلاس را تغییر دهد.
  • آنها از نظر دسترسی به داده ها محدود هستند.

چه موقع از چه روشی استفاده کنیم؟

ما عموما از متد class برای ایجاد متدهای کارخانه ای استفاده می کنیم. متدهای کارخانه شیء کلاس (مشابه سازنده) را برای موارد مختلف استفاده برمی گرداند.

ما عموماً از روشهای ایستا برای ایجاد توابع مفید استفاده می کنیم.

 

منبع.

 

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

  1. آموزش برنامه نویسی شی گرا در پایتون
  2. آموزش مقدماتی برنامه نویسی شی گرا در پایتون
  3. آموزش راه اندازی محیط برنامه نویسی شی گرا در پایتون
  4. آموزش ساختار داده برنامه نویسی شی گرا در پایتون
  5. آموزش بلوک ها در برنامه نویسی شی گرا در پایتون
  6. آموزش میانبرها در برنامه نویسی شی گرا در پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه