ارثبری در شیگرایی
در شیگرایی با کلاسی آشنا میشویم که اصطلاحا به آن کلاس فرزند میگویند، که از کلاس دیگری که اصطلاحا کلاس مادر نامیده میشود ارث میبرد. در واقع کلاس فرزند، تمام متدها و ویژگیهای کلاس مادر را ارث میبرد. در شیگرایی اگر یک کلاس مادر داشته باشیم برای ایجاد کلاس فرزند باید بعد از اینکه اسم کلاس فرزند را نوشتیم یک پرانتز باز و بسته کنیم و داخلش اسم کلاسی که میخواهیم از آن ارثبری کنیم را بنویسیم.
این عمل باعث میشود که زمانی که در شیگرایی نیاز به دو کلاس باشد. مثلا یک کلاس دانشجو و یک کلاس فارق التحصیل. بجای اینکه در کلاس فارقالتحصیل دوباره اطلاعات دانشجو را وارد کنیم. کلاس فارقالتحصیل را ارثبری میکنیم از کلاس دانشجو. در این صورت تمام متدها و ویژگیهایی که کلاس دانشجو دارد کلاس فارقالتحصیل هم ارثبری میکند.
در کد فوق یک کلاس مادر ایجاد کردهایم که دارای دو متد میباشد. متد اول ()who_I_am میباشد و متد دوم ()eat میباشد. در کلاس فرزند میتوانیم از متدهای کلاس مادر یعنی دو متد فوق، استفاده کنیم و یا آن را تغییر دهیم. همچنین میتوان در متد init کلاس فرزند، متد init کلاس مادر را استفاده کرد.
در کد فوق کلاس فرزند Dog را ایجاد کردهایم. در متد init کلاس فرزند، متد init کلاس مادر (Animal) را نیز قرار دادهایم. با این کار در شیگرایی زمانی که یک نمونه از کلاس فرزند (Dog) بگیریم، عملیات print که در متد init کلاس مادر وجود داشت نیز به همراه عملیات print کلاس فرزند، انجام میشود.
همچنین اگر متد who_I_am که در کلاس مادر است را با نام نمونه کلاس فرزند فراخوانی کنیم. عملیات مربروط به متد who_I_am انجام میشود.
در مورد متد eat از آنجایی که هم در کلاس مادر و هم در کلاس فرزند وجود دارد. ابتدا چک میشود اگر در کلاس فرزند وجود دارد همان متد و عملیات مربوط به آن در کلاس فرزند انجام میشود.
کاربرد تابع ()super در شیگرایی
در شیگرایی اگر بخواهیم ویژگیهای متد init کلاس مادر را در متد init کلاس فرزند داشته باشیم. از تابع super در داخل متد init کلاس فرزند استفاده میکنیم.
در شیگرایی اگر چند کلاس فرزند داشته باشیم و همه دارای یک متد یکسان باشند میتوان با for لوپ و یا ایجاد یک تابع، متدهای یکسان را فراخوانی کرد.
کپسولهسازی در شیگرایی
یکی از مفاهیم مهم شیگرایی کپسوله سازی است. ایده کپسوله سازی از بستهبندی دادهها و متدهایی که در داخل یک واحد کار میکنند، به وجود آمده است. این کار کمک میکند تا دسترسی مستقیم به متغیرها و متدها محدود شده و از تغییر تصادفی دادهها جلوگیری شود.
به عنوان مثال اگر ما یک کلاس به نام Car داشته باشیم. و از این کلاس یک شی بسازیم. میتوانیم ویژگیهای این کلاس را تغییر دهیم.
در شیگرایی اگر بخواهیم کلاس را کپسوله کنیم، تا متغیرهای کلاس قابل تغییر نباشند، بر طبق قرارداد پشت متغیر مورد نظر دوتا _ یا آندرلاین بذاریم.
در کد فوق دو تا آندرلاین قبل از ویژگی color قرار دادهایم. با این کار اگر از کلاس یک نمونه بسازیم. و بعد بخواهیم ویژگی این نمونه را عوض کنیم. به دلیل کپسولهسازی ویژگی مورد نظر، برنامه به ما خطا میدهد که اصلا همچین ویژگی نداریم.
از آنجایی که در شیگرایی کلاس کپسولهسازی شده را نمیشود از بیرون ویژگیهایش را عوض کرد. اگر بخواهیم ویژگیهای کلاس را تغییر دهیم، باید از داخل کلاس این کار را انجام دهیم. یعنی باید دو تا متد بسازیم. یکی برای ست کردن متغیر جدید و یکی برای چاپ کردن آن. در شیگرایی و کپسولهسازی به این دو متد set و get میگویند.
متدهای خاص در شیگرایی
در شیگرایی این متدها را معمولا با __در دو طرف اسم متد نمایش میدهند، و عملیات خاصی را به صورت پیش فرض انجام میدهند. به عنوان مثال در هنگام پرینت از آبجکتی که ساختهایم یک سری نوشته ظاهر میشود که اگر بخواهیم آن را تغییر دهیم میتوان از متد __str__ استفاده کرد.
تابع len به طور کلی تعداد اعضا را نشان میدهد، در شیگرایی میتوان در داخل کلاس با استفاده از متد __len__ بجای تعداد اعضا، هر چیز دیگری که بخواهیم را با فراخوانی این تابع نمایش دهیم.
با تابع del به طور کلی میتوانیم کلاس مورد نظر خود را پاک کنیم، اما در شیگرایی میتوان با استفاده از متد __del__ در داخل کلاس علاوه بر پاک شدن کلاس، هر دستور دیگری را که بخواهیم با فراخوانی این تابع، اجرا شود. با فراخوانی تابع del دستور مورد نظر به همراه پاک شدن آبجکت، انجام میشود. سپس اگر دوباره تابع del را فراخوانی کنیم با ارور اینکه دیگر این آبجکت وجود ندارد، مواجه میشویم.
برای آشنایی بیشتر با مباحث شیگرایی و نحوه کار با آنها میتوانید به دوره جامع آموزش زبان برنامهنویسی پایتون آکادمی رسا مراجعه کنید