در این قسمت قصد داریم تا با کلاسها (Classes) در زبان پایتون آشنا بشیم. همچنین در این قسمت قراره که برنامهنویسی شیگرا رو هم معرفی کنیم.
اگه قسمتهای قبل سری آموزشهای پایتون رو دنبال کرده باشین، متوجه میشین که ما به طور کلی با دو تا چیز کار کردیم. یکی دادهها و اطلاعات بودند و یکی هم توابع. اطلاعات میتونستند مقادیر با انواع مختلفی داشته باشیند و همچنین توابع هم یه سری کارها رو انجام میدادند. مثلا تابع print مقادیر رو توی صفحه نمایش نشون میداد.
تا به اینجای کار ما به طور جداگانهای با دادهها و توابع کار میکردیم. اما در ادامه که حجم کدها و برنامهها زیاد شد برنامه نویسا به مشکل برخوردند. از این رو تصمیم گرفتند برای سازماندهی بهتر کدها یه شیوه جدید رو در برنامهنویسی ابداع کنند. برنامهنویسی شئگرا یا Object Oriented Programming که به اختصار OOP هم بهش میگن. خب حالا این برنامهنویسی شئگرا چی هست و چه مزیتهایی داره.
برنامهنویسی شئگرا (Object Oriented Programming)
تعاریف مختلف و بعضا پیچیدهای برای برنامهنویسی شئگرا وجود داره اما به عبارت ساده یعنی ما گرایش داریم تا همه چیز رو شئ در نظر بگیریم. خب حالا این یعنی چی؟
ما در دنیای پیرامونمون با اشیاء زیادی سر و کار داریم. برای مثال بیاین یه چیزی مثل یه خودکار رو در نظر بگیرین. این خودکار یه سری ویژگیها و خصیصههایی داره مثلا: رنگ جوهر، نوع خودکار، میزان ضخامت و…
در کنار این ویژگیها یه سری کارهایی هم انجام میده مثل نوشتن.
در برنامهنویسی شئگرا هم مشابه چنین چیزی رو داریم. یه سری خصوصیات داریم که همون دادههای ما میشن و یه سری متدها. از ترکیب این متدها و خصیصهها میتونیم اشیاء یا آبجکتها رو به وجود بیاریم.
برای اینکه ما اشیاء رو در محیط برنامهنویسی ایجاد کنیم نیاز به یه طرح داریم. همونطور که یه ساختمان نیاز به یه نقشه کلی داره. که به این طرح کلی کلاس (Class) گفته میشه.
تعریف کلاس در زبان پایتون
در ادامه قصد داریم تا با نحوهی تعریف کلاسها در پایتون آشنا بشیم. برای مثال بیاین برای یه موجودی مثل یه شخص یا Person یه کلاسی رو تعریف کنیم.
class Person:
def __init__(self, name, job):
self.name = name
self.job = job
def sleep(self):
print(“I’m Sleeping …”)
def eat(self, food):
print(f”I’m Eating {food} …”)
توضیح:
در ابتدا باید کلمه کلیدی class به همراه یه نام دلخواه رو بنویسیم که در واقع این نام، نام همون کلاس ما هستش که معمولا با حرف بزرگ شروع میشه.
در خطهای بعدی که همون بدنهی کلاس رو تشکیل میدن حتما باید فاصلهگذاریها رعایت بشن. به اندازه ۴ فاصله یا یه تب.
تابع init
متد init یه تابعی هستش که هنگام ایجاد شئ در برنامه به طور خودکار اجرا میشه و نیازی نیستش که اونو صدا بزنیم. معمولا از این تابع برای یه سری کارهای اولیه مثل مقدار دهی برخی ویژگیهای کلاس استفاده میشه.
اگه دقت کنید نحوهی تعریف این تابع به صورت هستش که در ابتدا کلمه کلیدی def میاد و بعد از اون دو تا کاراکتر ـ میاد و سپس کلمه init و بعد از اون هم دوباره دو بار کاراکتر ـ بدون فاصله نوشته میشه.
در قسمت بعد باید پارامترهای تابع init ذکر میشن.
نکتهی مشترکی که در تعریف توابع وجود داره استفاده از کلمه کلیدی self به عنوان پارامتر اول متدهای درون کلاسها هستش. مثلا در این تابع init ابتدا کلمه کلیدی self اومده و بعد از اون به ترتیب پارامترهای name و job میان.
بعد از اون نوبت به بدنه تابع init میرسه که ما در اینجا دو تا خصیصه برای این کلاس تعریف کردیم که با self.name و self.job به اونها دسترسی داریم و اونا رو مقداردهی میکنیم.
در ادامهی تعریف این کلاس دو تا تابع دیگه به نام sleep و eat اومده که اگه دقت کنید حتما باید پارامتر اولشون self باشه. بدنهی این متدها هم واضح هستند و دارن یه پیامی رو چاپ میکنند.
خب تا به اینجای کار ما فقط یه کلاس رو تعریف کردیم. کلاسها به عبارتی همون طرح و نقشهی اشیاء ما هستند و در مرحلهی بعد ما باید اشیاء و آبجکتهای مورد نظر خودمون رو بر اساس این کلاسها تعریف کنیم.
ایجاد آبجکت از کلاس
p1 = Person(‘Ali’, ‘Student’)
p1.sleep()
p1.eat(‘dinner’)
توضیح:
در خط اول یه متغیر با نام p1 تعریف کردیم که در واقع همون آبجکت مورد نظر ما از کلاس Person هستش. در این خط داخل آرگومانهای این کلاس مقادیر ali و Student رو نوشتیم که به ترتیب نام و شغل فرد مورد نظر ما هستش. نکتهای که وجود داره اینه که این قسمت دقیقا باید منطبق با بخش تابع init در بدنه کلاس باشه.
در خطهای بعدی توابع sleep و eat صدا زده میشن و اجرا میشن. اگه دقت کنید در تعریف متدها در داخل بدنه کلاس پارامتر self حتما به عنوان اولین پارامتر نوشته میشد اما هنگام فراخوانی توابع نباید اونا رو بنویسیم و آرگومانهای بعد از اون رو باید وارد کنیم.