Table of Contents
مقدمهٔ برنامهنویسی شیگرا در پایتون
در فصلهای قبل با متغیر، تابع، لیست، دیکشنری و ... کار کردید و برنامههای ساده نوشتید. در این فصل با یک سبک مهم برنامهنویسی به نام برنامهنویسی شیگرا (Object-Oriented Programming یا بهاختصار OOP) آشنا میشوید که در پروژههای واقعی و بزرگ بسیار رایج است.
در این فصل به این بخشها میپردازیم:
- ایدهٔ کلی برنامهنویسی شیگرا
- تعریف کلاس و ساختن شیء (Object)
- تعریف ویژگیها (Attributes) و متدها (Methods)
- متد ویژهٔ
__init__ - مفهوم سادهٔ کپسولهسازی
- وراثت در حد مقدماتی
- چند مثال کامل و سادهٔ شیگرا
هدف این فصل این است که:
- بفهمید شیگرایی چه مسئلهای را حل میکند،
- بتوانید کلاسهای ساده تعریف کنید،
- از کلاسها و اشیاء در برنامههای کوچک خود استفاده کنید.
در ادامه، هر زیرعنوانِ فصل ۱۳ محتوای مخصوص خود را خواهد داشت و اینجا فقط یک تصویر کلی و ارتباط بین این مفاهیم را میسازیم تا در زیرفصلها بهتدریج عمیقتر شوید.
چرا سراغ برنامهنویسی شیگرا میرویم؟
وقتی برنامهها کوچک هستند، ترکیبی از متغیرها، توابع و چند لیست و دیکشنری کفایت میکند. اما وقتی:
- تعداد متغیرها زیاد میشود،
- اطلاعات مختلفی به هم وابسته میشوند،
- توابع زیادی برای کار با یک «چیز» خاص مینویسید،
- و پروژه بزرگتر میشود،
مدیریت کد سخت، گیجکننده و پر از اشتباه میشود.
برنامهنویسی شیگرا کمک میکند:
- داده و رفتار مرتبط به هم را کنار هم نگه دارید.
- داده = ویژگیها (مثل
name,age) - رفتار = متدها (مثل
bark(),walk()) - کد را شبیه دنیای واقعی مدل کنید.
بهجای پخش شدن متغیرها و توابع، میگویید: «من یکDogدارم که نام، سن، نژاد و رفتارهایی مثل واقواق کردن و دویدن دارد.» - ساختار بدهید، نه فقط تکهکد.
کلاسها مثل «قالب» یا «نقشه» هستند و اشیاء مثل «نمونههای واقعی» آن قالب.
این ایدهها در زیرفصل «برنامهنویسی شیگرا چیست؟» با مثالهای سادهتر و مقایسه با کدی که کلاس ندارد توضیح داده میشوند.
تصویر کلی: کلاس، شیء، ویژگی و متد
در شیگرایی، چهار واژهی اصلی را دائماً میبینید:
- کلاس (Class)
- یک «طرح» یا «قالب» است.
- تعریف میکند که یک نوع شیء چه ویژگیها و چه رفتارهایی دارد.
- برای تعریف از کلمهٔ کلیدی
classاستفاده میکنیم. - شیء (Object) یا نمونه (Instance)
- چیزی است که از روی کلاس ساخته میشود.
- هر شیء دادهٔ خودش را دارد.
- از کلاس مثل یک «نوع دادهٔ جدید» استفاده میکنید.
- ویژگی (Attribute)
- متغیرهایی که به یک شیء یا کلاس تعلق دارند.
- مثل
self.name,self.ageدر داخل یک کلاس. - متد (Method)
- تابعهایی که داخل کلاس تعریف میشوند و معمولاً روی همان شیء کار میکنند.
- از نظر سینتکس خیلی شبیه تابع هستند، اما اولین پارامترشان معمولاً
selfاست.
این مفاهیم در زیرفصلهای:
- «کلاسها و اشیاء»
- «ویژگیها و متدها»
با مثالهای دقیق و مرحلهبهمرحله تمرین خواهند شد.
نگاهی سریع به شکل کلی یک کلاس
ساختار بسیار سادهی یک کلاس در پایتون شبیه این است:
class Person:
def __init__(self, name, age):
self.name = name # ویژگی
self.age = age # ویژگی
def say_hello(self): # متد
print("سلام، من", self.name, "هستم.")و ساختن شیء از آن:
p1 = Person("علی", 20)
p1.say_hello()در زیرفصلها خواهید دید:
- این
__init__دقیقاً چه میکند، selfیعنی چه،- چطور میشود به ویژگیها مقدار جدید داد،
- و چطور متدهای جدید اضافه کرد.
در این فصل اصلی، فقط تصویر کلی را در ذهن نگه دارید:
کلاس = قالب و شیء = چیز واقعی ساخته شده از آن قالب.
`__init__` چیست و چرا مهم است؟
در شیگرایی با متدی ویژهای زیاد روبهرو میشوید: __init__.
نکتههای مهم و کلی دربارهٔ آن (جزئیات در زیرفصل خودش میآید):
- وقتی از روی یک کلاس، شیء جدید میسازید،
پایتون بهطور خودکار متد__init__آن کلاس را اجرا میکند. - هدف
__init__معمولاً آمادهسازی شیء تازهساختهشده است: - تنظیم مقدار ویژگیها،
- بررسی اولیهی ورودیها (در برنامههای جدیتر).
- پارامتر اولش همیشه
selfاست (که به همان شیء در حال ساختهشدن اشاره میکند).
مثال تصویری:
class Car:
def __init__(self, brand, year):
self.brand = brand
self.year = year
c = Car("Toyota", 2020) # اینجا __init__ خودکار اجرا میشود
در زیرفصل «متد __init__» تمرینها و الگوهای رایجتری را خواهید دید.
کپسولهسازی بهزبان ساده
یکی از ایدههای مهم در OOP، کپسولهسازی است.
بهصورت ساده:
- یعنی جمع کردن داده و رفتار مرتبط در یک «بسته» واحد (کلاس/شیء).
- و در سطح بالاتر، یعنی پنهان کردن جزئیات داخلی و فقط نشان دادن یک «رابط» (متدها) به کاربر کلاس.
در پایتون:
- برخلاف بعضی زبانها، «خصوصی» و «عمومی» بودن بهشکل رسمی و سختگیرانه وجود ندارد،
- اما قراردادهایی داریم:
- نامهایی که با
_یا__شروع میشوند را بهعنوان «داخلی» در نظر میگیریم و مستقیم دستکاری نمیکنیم (مگر با آگاهی).
این موضوع در زیرفصل «کپسولهسازی» با مثالهایی مثل:
- جلوگیری از تنظیم مستقیم برخی ویژگیها،
- تعریف متدهایی برای خواندن/تغییر کنترلشدهٔ دادهها
بهصورت عملی نشان داده خواهد شد.
ایدهٔ وراثت (مقدماتی)
وراثت راهی است برای اینکه:
- از یک کلاس پایه (یا والد) شروع کنید،
- و کلاسهای فرزند بسازید که:
- ویژگیها و متدهای کلاس والد را «به ارث میبرند»،
- و میتوانند چیزهای جدید اضافه کنند،
- یا رفتار قبلی را کمی تغییر دهند.
این کمک میکند:
- کد تکراری کمتر شود،
- ساختاری شبیه دستهبندیهای واقعی دنیا داشته باشید
(مثلاًAnimal→Dog,Cat).
مثالِ فقط برای دیدن شکل کلی (توضیح کامل در زیرفصل «وراثت (مقدماتی)»):
class Animal:
def speak(self):
print("حیوانی صدا میکند")
class Dog(Animal):
def speak(self):
print("واق واق!")
d = Dog()
d.speak() # واق واق!
اینجا Dog از Animal ارثبری میکند و رفتار speak را مخصوص خودش تعریف میکند.
OOP در کنار چیزهایی که از قبل میدانید
چند نکته برای اینکه این فصل را در ذهنتان در کنار فصلهای قبلی قرار دهید:
- کلاسها در پایتون مثل این هستند که شما یک نوع دادهٔ جدید بسازید.
- اشیاء مثل متغیرهای
int,str,listهستند،
فقط نوعشان اینبار کلاسی است که خودتان تعریف کردهاید. - متدها از نظر استفاده شبیه توابع هستند،
فقط بهجایfunc(x)بهشکلobject.func()فراخوانی میشوند. - همه چیز در پایتون در نهایت یک شیء است،
حتیlistوstrهم کلاسهایی در کتابخانهٔ استاندارد پایتون هستند.
در زیرفصلهای «مثالهای سادهٔ شیگرا» خواهید دید:
- چطور میشود با چند کلاس ساده،
یک برنامهٔ کوچک اما تمیزتر و قابلگسترشتر نوشت، - و تفاوت خوانایی و سازماندهی کد نسبت به نسخهٔ «بدون کلاس» چیست.
چطور از این فصل بیشترین استفاده را ببرید؟
برای درک OOP، فقط خواندن کافی نیست؛ باید کلاس بسازید و با آن بازی کنید:
- در هر زیرفصل:
- مثالها را در محیط خودتان (ترمینال یا IDE) تایپ و اجرا کنید.
- مقادیر را عوض کنید و ببینید چه میشود.
- خودتان مثال بسازید:
- کلاس برای
کتاب,دانشجو,محصول,حساببانکیو ...
در پایان این فصل، باید بتوانید:
- یک کلاس ساده تعریف کنید،
- با
__init__ویژگیهای اولیه را تنظیم کنید، - متدهایی بنویسید که روی ویژگیهای شیء کار میکنند،
- مفهوم سادهٔ کپسولهسازی را درک کنید،
- و از وراثت در سطح مقدماتی برای کاهش تکرار کد استفاده کنید.
در زیرعنوانهای بعدی فصل ۱۳، هرکدام از این مفاهیم با جزئیات و تمرینهای مشخص یاد گرفته خواهند شد.