معرفی برنامه نویسی شی گرا در پایتون
پایتون یک زبان برنامه نویسی سطح بالا، تفسیری و شی گرا است که هر روز به استفاده کنندگان این زبان برنامه نویسی محبوب در جهان اضافه میشود. برنامه نویسی در پایتون براساس الگوی برنامه نویسی شی گرا هست و قطعا هر فردی که میخواهد از این زبان برنامه نویسی به خوبی استفاده کند، لازم است که با برنامه نویسی شی گرا آشنا باشد. در این پست توضیح میدهیم که برنامه نویسی شی گرا چیست و چطور میشه در پایتون کلاس و object تعریف کرد.
فهرست مطالب
- برنامه نویسی شی گرا
- مفهوم object و کلاس
- نحوه تعریف یک کلاس
- نحوه ساخت یک object
- نحوه تعریف شناسه های یک object
- نحوه تعریف متدهای یک object
- نحوه فراخوانی متدهای یک object
- نحوه دسترسی به شناسه های یک object
- مثال عملی
برنامه نویسی شی گرا
برنامه نویسی شی گرا یک سبک برنامه نویسی است که در آن برای ساختاربندی یک برنامه مشخصات و رفتارهای مرتبط، به یک سری objectهای مجزا تبدیل میشوند. به طور مفهومی، object ها اجزای یک سیستم هستند که کنار هم کل سیستم رو تشکیل میدهند.
به عنوان مثال میتونید فرایند دسته بندی ماهی سالمون و سیباس در یک کارخانه رو در نظر بگیرید:
در هر مرحله از این سیستم، هر جزء از سیستم داده ای را پردازش میکند و در نهایت داده خام به یک خروجی نهایی تبدیل میشود و در نهایت سیستم مشخص میکند ماهی در کدام سبد قرار بگیرد.
یک object حاوی داده است، مثل تصویر خام یا پیش پردازش شده در هر مرحله از سیستم تشخیص ماهی و یک رفتاری دارد. رفتار در واقع عملیاتی است که در هر مرحله روی تصویر ماهی، یک جزء انجام میدهد.
به زبان ساده تر اگر بگیم، برنامه نویسی شی گرا میگه که جهان اطراف ما دارای یک سری شیء است که هر کدام از آنها یک سری مشخصاتی دارند و کارهایی انجام میدهند. ساده ترین مثال هم میشه مثال انسان را زد. اگر یک انسان را یک object در نظر بگیریم، از دید شی گرایی میتوان انسان را به این شکل تعریف کنیم:
مفهوم object و کلاس
Object واحد اصلی برنامه نویسی شیگرا است که دارای یک سری مشخصات و رفتارهایی هست. همانطور که در پست قبلی اشاره کردیم، درسطح پایه، یک object به طور ساده داری چندین خط کد و به علاوه ساختارهای داده است که بخش جزئی از برنامه اصلی را تشکیل میدهد.
تعریف تابع به ما اجازه میدهد که بخشی از کد را در آن ذخیره کنیم و بعدا هر زمان لازم بود فراخوانی کنیم. یک object میتواند تعدادی تابع داخلش داشته باشد، که بهشون method گفته میشود و dataای که توسط همین توابع استفاده می شود.
data مشخصات object است و متدها رفتار object را مشخص میکنند.
ما برای اینکه بتوانیم یک object بسازیم، لازم است که اول کلاس آن را تعریف کنیم. به عبارتی ما اول میام مشخصات و رفتار هر object را در یک کلاس تعریف میکنیم و بعد از روی آن object را میسازیم. بگذارید اول با یک مثال ساده با ارتباط بین کلاس و object آشنا شویم.
در این مثال، قالب کیک الگو/ شکل و فرم کیکی که قراره از روش ساخته بشه رو مشخص میکند. اینجا کیک نمونه ای است که از روی قالب کیک ساخته شده است. در بحث OOP، قالب کیک Class هست و کیک object. به عبارتی کلاس یک الگو/نقشه ای است که مشخص میکند موقع ساخت، object چه شکلی باشد. به عبارتی چه مشخصات و رفتاری داشته باشد.
نحوه تعریف یک کلاس در پایتون
Python
class ClassName:
body of class
در پایتون برای تعریف یک کلاس از کلمه کلیدی class استفاده میشود. بعد از آن اسم کلاس را مینویسیم و در داخل بدنه هم مشخصات و رفتارهای objectی که قرار است از روی این کلاس ساخته شود را تعریف میکنیم.
- نکته: به صورت قراردادی تعیین کرده اند که حرف اول اسم کلاس بزرگ باشد و اگر اسم کلاس شامل چندین کلمه بود، حرف اول هر کلمه بزرگ نوشته بشه و مابقی حروف کوچک باشند.
برای اینکه روند کار رو بهتر متوجه شویم، بیایید یک مثالی در نظر بگیریم و توضیحات را به صورت مرحله به مرحله با مثال عملی پیش ببریم.
کلید دیمر (DimmerSwitch) را به عنوان یک object در نظر بگیرید که دارای مشخصات و رفتارهای زیر است.
از نظر تئوری میتونیم بگیم این کلید، لامپ رو روشن و خاموش میکنه و میتونه میزان روشنایی اون رو کنترل کنه. از طرفی دو led هم روی کلید هست که وضعیت خاموش/روشن بودن و میزان روشنایی لامپ رو نشان می دهند. حال بیاییم این کلید رو در قالب یک objectی در پایتون شبیه سازی کنیم.
برای این object بهتر است دو تا شناسه در نظر بگیریم:
- isOn: وضعیت روشن خاموش بودن لامپ رو مشخص بکند.
- brightness: میزان روشنایی لامپ رو مشخص بکند.
و بهتر است 5 متد براش در نظر بگیریم:
- ()turnOn: لامپ رو روشن کند
- ()turnOff: لامپ رو خاموش کند
- ()raiseLevel: میزان روشنایی رو افزایش بدهد.
- ()lowerLevel: میزان روشنایی رو کاهش بدهد.
- ()show: وضعیت رو نشان بدهد.
حال میخواهیم به صورت قدم به قدم، برای این object اول یک کلاس تعریف کنیم و بعد از روی آن object کلید دیمر را بسازیم.
مرحله اول: تعریف کلاس
Python
class DimmerSwith:
pass
فعلا در بدنه کلاس، حرف کلیدی pass رو گذاشتیم که بعدا بیاییم اونجا کدهای مورد نظر رو قرار دهیم. مثل همون قابلمه ای می مونه که در صف میگذاریم!
مرحله دوم: تعریف شناسه های object
اگه ما objectی داشته باشیم، به شکل زیر میتوانیم برای آن یک شناسه ای تعریف کنیم:
objectName.atrributeNAME= value
برای مثال اگر objectی به اسم dimmer داشته باشیم، میتونیم به شکل زیر براش یک شناسه تعریف کنیم.
dimmer.brightness= 5
با اینکار یک شناسه ای به اسم brightness برای شیء dimmer تعریف شده و مقدار 5 برای آن در نظر گرفته میشود.
ولی مسئله این هست که ما هنوز، objectی نساختیم که بتوانیم براش شناسه تعریف کنیم. از طرفی میخواهیم تعریف شناسه ها، در داخل بدنه class انجام شود. برای اینکار میتوانیم از متد ()__init__ استفاده کنیم. در پایتون، شناسه های یک object در داخل یک متدی به اسم ()__init__ تعریف میشوند. این متد یک روش جادویی (بعدا در پست جدا متدهای جادویی را بررسی خواهیم کرد) هست که هر موقع objectی از روی کلاس ساخته شود، خود به خود فراخونی میشود و کدهای داخلش اجرا میشوند. برای همین بهترین جا برای تعریف شناسه های یک object همینجا هست. تا به محض ساخت object، شناسه ها نیز تعریف شده باشند.
تمامی متدهای داخل یک object یک ورودی اول به اسم self دارند که اشاره میکند به objectی که قرار است از روی کلاس ساخته شود، و اون متد روی آن اعمال شود.
پس وقتی مینویسیم self.brightness=value معنیش این است که شناسه ای به اسم brightness برای object بساز و مقدار value را براش در نظر بگیر.
- اگر بخواهیم مقدار شناسه را کاربر موقع ساخت object تعیین کند، در اونصورت برای متد ()__init__ ورودیهای دیگری به غیر از self باید تعریف کنیم. در این مثال مقدار روشنایی رو میخواهیم کاربر تعیین کند، این مقدار را به عنوان ورودی دوم ()__init__ در نظر میگیریم تا موقع ساخت object کاربر اون مقدارو مشخص کند.
Python
class DimmerSwith:
def __init__(self, brightnessValue):
self.isOn= False
self.brightness= brightnessValue
لازم به ذکر است که ما بعد از تعریف یک شناسه به شکل زیر میتوانیم بهش دسترسی داشته باشیم:
Value= objectName.atrributeName
برای مثال اگر objectی به اسم dimmer داشته باشیم، و object هم شناسه ای به اسم brightness داشته باشد به شکل زیر میتونیم به مقدار اون شناسه دسترسی داشته باشیم.
value= dimmer.brightness
لازم به ذکر هست که همه متدهای object به شناسه های آن دسترسی دارند و میتوانند در صورت نیاز مقادیر آنها را تغییر دهند. در داخل متدهای object به شکل زیر میتوان به مقدار شناسه ی یک object دسترسی پیدا کرد.
value= self.brightness
اینجا self اشاره میکند به objectی که از روی کلاس ساخته شده و ما مقدار شناسه brightness آنرا در value قرار میدهید.
مرحله سوم: تعریف رفتارهای یک object
در پایتون به تعریف یک رفتار، تعریف method گفته میشود. در واقع method یک تابعی است که در داخل بدنه کلاس تعریف می شود و روی object اعمال می شود.
فرق متد با تابع این است که متدها یک ورودی اولی به اسم self دارند. و اگر هنگام تعریف متد object، ورودی اول را تعریف نکنیم پایتون خطا خواهد داد! البته اسم self قراردادی هست و هر اسمی میتوان گذاشت.
به شکل زیر میتوانیم برای object متد تعریف کنیم:
Python
def mehtodName(self, <arguments>)
body of method
اگر متد، ورودی لازم داشته باشد، بعد از self آنها را به ترتیب مشخص میکنیم.
حال بیایید متد ()turnOn را برای کلید دیمر تعریف کنیم:
Python
class DimmerSwith:
def __init__(self, brightnessValue):
self.isOn= False
self.brightness= brightnessValue
def turnOn(self):
if self.isOn==False:
self.isOn=True
همانطور که مشخص است، این متد ورودی دیگری به غیراز self ندارد. در این متد، ما از روی شناسه isOn وضعیت روشن/خاموش بودن لامپ را بررسی میکنیم، و اگر لامپ خاموش باشد، روشن میکنیم.
به عبارتی در ابتدا مقدار شناسه را چک میکنیم و سپس اون رو تغییر داده و مقدار جدید True را برای آن در نظر میگیریم.
حال بیایید متد ()turnOff را برای object تعریف کنیم:
Python
class DimmerSwith:
…
def turnOff(self):
if self.isOn==True:
self.isOn=False
در این متد، ما از روی شناسه isOn وضعیت روشن/خاموش بودن لامپ را بررسی میکنیم، و اگر لامپ روشن باشد، خاموش میکنیم.
حال بیایید متد ()raiseLevel رو برای کلید دیمر تعریف کنیم:
Python
class DimmerSwith:
…
def raiseLevel(self):
if self.brigthness<10:
self.brigthness= self.brigthness+1
اگر فرض کنیم، حداکثر شدت روشنایی 10 است، در اینصورت در این متد مشخص میکنیم که هر موقع این متد فراخوانی شد، اگر شدت روشنایی کمتر از 10 بود، یک عدد بهش اضافه کند.
ما در این متد، مقدار شناسه object را update میکنیم و به مقدار قبلی آن یک عدد اضافه میکنیم.
حال بیایید متد ()lowerLevel رو برای کلید دیمر تعریف کنیم:
Python
class DimmerSwith:
…
def lowerLevel(self):
if self.brigthness>0:
self.brigthness= self.brigthness-1
اگر فرض کنیم، حداقل شدت روشنایی 0 است، در اینصورت شخص میکنیم که هر موقع این متد فراخوانی شد، اگر شدت روشنایی بیشتر از 0 بود، یک عدد ازش کم شود.
ما در این متد، مقدار شناسه object را update میکنیم و از مقدار قبلی آن یک عدد کم میکنیم.
حال بیایید آخرین متد ()show رو برای کلید دیمر تعریف کنیم:
Python
class DimmerSwith:
…
def show(self):
print(‘brightness is:’, self.brigthness)
print(‘switch status is:’, self.isOn)
کار اصلی ما تمام شد! شناسه ها و رفتارهای object را تعریف کردیم و آماده ایم که از روی این کلاس، object و یا objectهایی بسازیم.
نکته: همانطور که قالب کیک خود به خود کیکی نمیسازد، تعریف کلاس هم objectی نمیسازد! ما تا اینجای کار فقط قالب کیک رو ساختیم نه خود کیک رو! پس باید از روی کلاس object بسازیم تا بتوانیم از داده ها و کدهای داخل object استفاده کنیم.
مرحله چهارم: ساخت object از روی کلاس
برای ساخت object از روی کلاس، کافیه به شکل زیر عمل کنیم:
objectName= ClassName(<arguments>)
اگر در متد ()__init__ به غیر از self، ورودیهای دیگری تعریف کرده ایم، حتما باید آنها را به ترتیب در داخل پرانتر قرار دهیم. اگر به غیر از self، ورودی دیگری تعریف نکرده باشیم، به شکل زیر object را از روی کلاس میسازیم.
objectName= ClassName()
نکته: حتما باید پرانتر باشد.اگر پرانتز نگذاریم پایتون خطا نمیدهد ولی objectی هم نمی سازد.
در مثال خودمون، یک ورودی به غیر از self تعریف کرده بودیم. پس به شکل زیر از روی کلاس تعریف شده object را میسازیم.
dimmer= DimmerSwith(5)
با اجرای این کد object ی از روی کلاس تعریف شده ساخته می شود. اسم این object را dimmer گذاشته ایم و با این اسم میتوانیم به شناسه ها و متدهای داخل آن دسترسی داشته باشیم.
نکته: به محض اجرای این کد، متد ()__init__ فراخوانی میشود و کدهای داخلش اجرا می شوند. در نتیجه یک شناسه به اسم isOn برای شیء dimmer ساخته میشود و مقدار False برای آن لحاظ میشود و یک شناسه به اسم brightness تعریف می شود و مقدار 5 ای که کاربر مشخص کرده برای آن لحاظ می شود.
به فرایند ساخت object از روی کلاس، نمونه سازی (instantiation) گفته می شود.
مرحله آخر: استفاده از object در پروژه
ما با یک هدفی، object های مختلفی تعریف میکنیم که هر کدام مشخصات و رفتارهای خودشون رو در سیستم دارند. حال میتوانیم با کنار هم قرار دادن این object ها، سیستم نهایی خود را بسازیم.
چند نکته پایانی:
نحوه دسترسی به شناسه یک object
Value= objectName.atrributeName
در مثال خودمون:
value= dimmer.brightness
status= dimmer.isOn
نحوه فرخوانی متد یک object
برای فراخوانی متدهای یک object به شکل زیر عمل میکنیم.
ouputs= objectName.methodName(<arguments>)
نکته: همانطور که اشاره کردیم، ورودی اول به خود object اشاره میکند. و برای همین ما موقع فراخوانی متد یک object بهش ورودی نمیدهیم. فقط سایر ورودیها را میدهیم. مگر اینکه بخواهیم به شکل زیر فراخوانی کنیم.
ouputs= ClassName.methodName(objectName,<arguments>)
اینجا فرم کامل فراخوانی را نوشتیم، معنی این کد این هست که برو در کلاس ClassName متد methodName را روی شیء objectName اعمال کن!
الان خود object رو به عنوان ورودی میدهیم که همان ورودی اول self است.
در مثال خودمون:
dimmer.show()
>>> switch is False
brightness is 5
یا
DimmerSwitch.show(dimmer)
>>> switch is False
brightness is 5
چون داخل هیچ کدام از متدها خروجی بیرون ندادیم (return استفاده نکردیم)، برای همین این متدها خروجی ندارند که در متغیری بریزیم. فقط هر متد داخل خودش یا شناسه ای را update میکند و یا مقداری را چاپ میکند. اگر خروجی داشته باشیم، مثل توابع، اونارو در متغیرهای خروجی قرار میدهیم.
در فصل چهارم دوره پایتون،اصول برنامه نویسی به سبک شیء گرا در پایتون از پایه آموزش داده شده است.
دیدگاه ها