برنامه نویسی شی گرا یک پارادایم برنامه نویسی است که وسیله ای برای ساختاربندی برنامه ها را فراهم می کند تا خصوصیات و رفتارها در اشیاء مجزا جمع شوند.
به عنوان مثال، یک شیء می تواند نمایانگر شخصی با ویژگی هایی مانند نام، سن و آدرس و رفتارهایی مانند راه رفتن، صحبت کردن، تنفس و دویدن باشد. یا می تواند یک ایمیل حاوی ویژگی هایی مانند لیست گیرندگان، موضوع و متن و رفتارهایی مانند افزودن پیوست ها و ارسال را نشان دهد.
به عبارت دیگر ، برنامه نویسی شی گرا یک رویکرد برای الگوبرداری از چیزهای واقعی است، مانند اتومبیل، و همچنین روابط بین چیزها، مانند شرکت ها و کارکنان، دانش آموزان و معلمان و غیره. OOP نهادهای دنیای واقعی را به عنوان اشیاء نرم افزاری که دارای داده های مرتبط با آنها هستند و می توانند عملکردهای خاصی را انجام دهند، مدل می کند.
توجه: در این بخش شما مقدمات شی گرایی در پایتون را میآموزید. بعد از اینکه چند ویدیو این قسمت را دیدید و به آنها مسلط شدید، به بخش آموزش پیشرفته شی گرایی در پایتون رفته و ویدیوهای آن بخش را نیز ببینید.
بقیه ویدیوها رو میتونید از لینک زیر ببینید:
در این بخش از آموزش شی گرایی در پایتون به سراغ کلاس میرویم. کلاسها مانند یک طرح اولیه یا نمونه اولیه هستند که می توانید برای ایجاد اشیاء از آنها استفاده کنید.
ما کلاسها را با استفاده از کلمه کلیدی class تعریف می کنیم ، مشابه نحوه تعریف توابع با استفاده از کلید واژه def.
بیایید یک کلاس به نام Car ایجاد کنیم. هر کدی که در زیر کلاس قرار گرفته باشد، بخشی از بدنه کلاس محسوب می شود.
class Car: pass
توجه: نام کلاس های پایتون باید به شکل CapitalizedWords نوشته شده است. به عنوان مثال، MySedanCar
یک آبجکت یا شی نمونه ای از یک کلاس است. ما می توانیم از کلاس Car که در بالا تعریف شده استفاده کنیم و از آن برای ایجاد یک شی یا نمونه استفاده کنیم.
ما یک شیء Car به نام benz خواهیم ساخت:
benz = Car()
متد به فانکشنهایی گفته میشود که درون یک کلاس قرار دارند. هر متد وظیفه انجام کار مشخصی را دارد. برای فراخوانی متدها باید از آبجکتی که از کلاس ساخته اید استفاده کنید. در کد پایین یک متد به نام drive در کلاس Car ایجاد کردهایم.
class Car: def drive(self): print('i drive a car') a = Car() a.drive() # OUTPUT i drive a car
در کد بالا بعد از ساختن متد drive، یک آبجکت از کلاس Car به نام a ایجاد کردهایم. سپس توانستیم با آبجکت a به متد drive دسترسی داشته باشیم.
زمانی که در پایتون یک متد میسازید اولین آرگومانی که باید به آن متد بدهید کلمه کلیدی self میباشد. کلمه self به خود آبجکت اشاره میکند که به شما امکان میدهد به attributeها و بقیه ویژگیها دسترسی داشته باشید. مثلا در کد پایین که با آبجکت a متد drive را صدا میزنیم به طور اتوماتیک آبجکت a به عنوان کلمه self به داخل متد ارسال میشود.
class Car: def drive(self): print('i drive a car') a = Car() a.drive()
در این بخش میآموزید که چطور از متد ــinit__ برای مقداردهی اولیه آبجکتهای در شی گرایی پایتون استفاده کنید. هنگامی که یک آبجکت از کلاس را ایجاد می کنید، پایتون به طور خودکار متد __init_() را برای مقداردهی اولیه attributeهای آبجکت فراخوانی می کند.
بر خلاف متدهای معمولی، متد init دارای دو underscore در اطراف آن است که نشان دهنده خاص بودن این متد دارد. به متدهایی که قبل و بعد از نام آنها دو underscore وجود داشته باشد، dunder گفته میشود. پس متد init به شکل dunder init خوانده میشود.
class Car: def __init__(self, name): self.name = name def show(self): print(self.name) a = Car('benz') a.show() # OUTPUT benz
زمانی که در کد بالا، از کلاس Car یک آبجکت ایجاد کردیم، مقدار benz را مستقیما به کلاس Car ارسال کردیم. که این مقدار به عنوان name در متد __init__ قرار میگیرد.
ویدیو مرتبط: ویدیو آموزش وراثت در پایتون
در این بخش میآموزید که چطور از ارثبری پایتون برای مدیریت بهتر کلاسها استفاده کنید. وراثت به شما اجازه میدهد از متدها و اتریبیوتهایی که در کلاسهای دیگر وجود دارد استفاده کنید.
class Car: def show(self): print('Nice Car...') class Benz(Car): pass a = Benz() a.show() # OUTPUT Nice Car...
در کد بالا، در داخل کلاس Car یک متد به نام show داریم که جمله Nice Car را چاپ میکند. در پایینتر، کلاس Benz را ساختهایم که از کلاس Car ارثبری میکند. در این حالت کلاس Benz میتواند به تمام اطلاعاتی که در کلاس Car وجود دارد، دسترسی پیدا کند.
در این مثال به کلاس Car، کلاس والد یا Super-class گفته میشود و به کلاس Benz، کلاس فرزند یا Sub-class گفته میشود.
در این بخش، شما یاد خواهید گرفت که چگونه از روش override پایتون استفاده کنید تا به یک کلاس فرزند اجازه دهید پیاده سازی خاصی از یک متد را که توسط یکی از کلاس های والد آن ارائه شده است، تغییر دهد. در زمانی که متدهای ارائه شده در کلاس والد مناسب کلاس فرزند نباشد، میتوانید متدی که در کلاس والد وجود دارد را در کلاس فرزند بازنویسی کنید.
class Car: def show(self): print('Nice Car...') class Benz(Car): def show(self): print('Nice Benz...') a = Benz() a.show() # OUTPUT Nice Benz...
در این آموزش، نحوه استفاده از متد super() پایتون را برای تفویض اختیار به کلاس والد هنگام بازگرداندن متدها یاد خواهید گرفت. در زمان بازنویسی متدهای کلاس پدر، فقط عملکردی که در کلاس فرزند وجود دارد اجرا خواهد شد. اما ممکن است نیاز داشته باشید که متدی که در کلاس پدر وجود دارد نیز در کنار متد کلاس فرزند اجرا شود. در این حالت میتوانید از متد super پایتون استفاده کنید که وظیفه صدا زدن متد پدر را دارد.
class Car: def show(self): print('Nice Car...') class Benz(Car): def show(self): super().show() print('Nice Benz...') a = Benz() a.show() # OUTPUT Nice Car... Nice Benz...
در کد بالا با استفاده از متد super پایتون مشخص کردیم که متد show که در کلاس Car وجود دارد نیز باید در کنار show کلاس Benz اجرا شود.
ویدیو مرتبط: ویدیو آموزش کلاس های abstract در پایتون
در این آموزش، با کلاس های انتزاعی پایتون و نحوه استفاده از آن برای ایجاد یک طرح اولیه برای کلاس های دیگر آشنا خواهید شد. در برنامه نویسی شی گرا، کلاس انتزاعی کلاسی است که قابل نمونه سازی نیست. با این حال، می توانید کلاس هایی ایجاد کنید که از یک کلاس انتزاعی به ارث می برند. به طور معمول، شما از یک کلاس انتزاعی برای ایجاد طرحی برای کلاس های دیگر استفاده می کنید. به طور مشابه، متد انتزاعی متدی بدون پیاده سازی است. یک کلاس انتزاعی ممکن است شامل متدهای انتزاعی باشد یا نباشد.
پایتون مستقیماً از کلاس های انتزاعی پشتیبانی نمی کند. اما ماژولی ارائه می دهد که به شما امکان می دهد کلاس های انتزاعی را تعریف کنید. برای تعریف یک کلاس انتزاعی، از ماژول abc استفاده می کنید. ماژول abc زیرساختی را برای تعریف کلاس های پایه انتزاعی در اختیار شما قرار می دهد.
from abc import ABC, abstractmethod class Car(ABC): @abstractmethod def show(self): pass class Benz(Car): def show(self): print('Nice Benz...') a = Benz() a.show() # OUTPUT Nice Benz
در کد بالا با استفاده ماژول abc توانستیم کلاس Car را به یک کلاس انتزاعی تبدیل کنیم. دیگر به طور مستقیم نمیوانیم از کلاس Car آبجکت بسازیم زیرا این کلاس به خودی خود کاری انجام نمیدهد، فقط مشخص میکند که کلاسهای دیگر باید چطور باشند.