مفهوم كلاس

شی گرایی در برنامه نویسی دقیقا همانند کار با اشیا در دنیای واقعی است. در دنیای واقعی اشیا قابل لمس و حقیقی هستند پس می توانیم خیلی راحت با آن ها تعامل برقرار کنیم، اما در دنیای مجازی اوضاع به همین صورت نیست. برای مثال شما نمی توانید یک دوچرخه یا یک ماشین را به صورت فیزیکی به برنامه وارد کنید! اما می توانید توسط ساختارهای خاص برنامه نویسی آن ها را با کدهایتان پیاده سازی کنید. ساختاری که وظیفه ی پیاده سازی اشیا در دنیای برنامه نویسی را به عهده داردکلاس نامیده می شود. به زبان راحت تر اشیا در دنیای برنامه نویسی به صورت کلاس تعریف می شوند.

طرز كار كلاس ها

اما طرز کار کلاس چگونه است؟ کلاس چگونه قادر به پیاده سازی اشیا می شود؟ جواب آنقدر ها هم سخت نیست. به حالت عادی هر شی در دنیای واقعی با سه جنبه ی اصلی شناخته می شود: نام شی، وضعیت شی، رفتار شی

مثلا یک سیدی پلیر را در نظر بگیرید:

  • نام این شی سیدی پلیر است.
  • این شی می تواند سیدی ای را اجرا کند، بین آهنگ های سیدی حرکت کند و غیره... این ها رفتاری هستند که از یک سیدی پلیر بر می آید.
  • اما منظور از وضعیت این شی چیست؟ سیدی پلیر مقدار بلندی صدا را کنترل میکند و یا میداند در حال حاضر چه مقدار از ادامه ی آهنگ باقی مانده است. مثلا می گوییم بلندی پلیر در حال حاضر روی درجه ی ۳۰ است. این یعنی وضعیت صدای پلیر ما روی ۳۰ تنظیم شده است.

کلاس ها علاوه بر این که نامی را برای اشیا در نظر میگیرند، می توانند وضعیت اشیا را توسط متغیرهای کلاس، و رفتار آن ها را توسط متدهای کلاس پیاده سازی کنند. متغیرهای کلاس، متغیر هایی هستند که درون بدنه ی آن کلاس تعریف شده اند تا نگه دارنده ی وضعیت و اطلاعات آن کلاس باشند. متدها هم همان توابع عادی هستند که وقتی در بدنه ی کلاس تعریف می شوند مسئولیت پیاده سازی رفتار کلاس را به عهده می گیرند. حالا که متوجه طرز کار ساختار کلاس شدید، در قسمت بعد سعی می کنیم همین شی سیدی پلیر را با این ساختار پیاده سازی کنیم.

پیاده سازی كلاس ها

در این قسمت قصد داریم ساختار سیدی پلیر را توسط یک کلاس پیاده سازی کنیم. بهتر است ابتدا کدهایمان را بنویسیم و سپس راجع به تک تک خط هایمان توضیح دهیم. این فقط یک مثال ساده است پس ما قرار نیست زیاد به جزییات توجه کنیم. در حال حاظر شما باید سعی کنید بیشتر از طرز کار کدها، به ساختار بندی کدها توجه کنید:

 

كد كلاس پخش كننده سی دی

class CdPlayer(object):
    
def __init__(self):
self.volume = 20
self.currentSong = 0
   
def setVolume(self, newValue):
self.volume = newValue
  
def play(self, trackNumber):
#operation for palying songs

def nextSong(self):
self.currentSong += 1
self.play(currentSong)
  
def previousSong(self):
self.currentSong -= 1
self.play(currentSong)

افراد مبتدی در پایتون به احتمال زیاد از طرز تعریف کردن این کلاس تعجب کرده اند. بله تعریف این کلاس با تعریف کلاس های عادی پایتون فرق دارد. در مقاله ی اول به شما قول داده شد بود که تمام مباحث این سلسله مقالات بر پایه ی کلاس های سبک جدید پایتون (new-style classes) خواهد بود. پس بگذارید قبل از این که به مو شکافی مثالمان بپردازیم مقداری هم راجع به کلاس های سبک جدید توضیح دهیم.

كلاس های سبك جدید

در پایتون تمام اجزای اصلی زبان به صورت اشیا پیاده سازی شده اند. از متغیر ها و توابع و انواع داده های اصلی مثل int بگیرید تا خود کلاس ها. بله، حتی خود کلاس ها هم به صورت اشیا تعریف شده اند. طبق تصمیماتی که مبنی بر یکپارچه ساختن اشیای زبان و اشیای تعریف شده از طرف برنامه نویسان صورت پذیرفت، تمام اشیای اصلی زبان پایتون از یک شی واحد و برتر به نام object ساخته میشوند و یا به عبارت دیگر ارث میگیرند. این مساله چند سالی است که در پایتون اتفاق افتاده است اما به علت عادت قدیمی برنامه نویسان به کلاس های عادی و همچنین نبود مستندات کافی برای تشریح کلاس های جدید، هنوز هم که هنوزه کلاس های سبک جدید فراگیر نشده اند. به هر حال در نسخه های آینده ی پایتون دیگر خبری از آن کلاس ها قدیمی نیست و این کلاس های جدید جایگزین آن ها خواهند شد پس بهتر است که در یادگیری آن ها عجله کنید.

کلاس های شما اگر به صورت عادی تعریف شوند جزو کلاس های کلاسیک و قدیمی پایتون محسوب میگردند. اما اگر می خواهید کلاس شما به صورت سبک جدید تعریف شود و از مزایای زیاد این گونه کلاس ها بهره مند شود، باید به هنگام تعریف کلاس خود از شی برتر object و یا اشیایی که از آن ارث برده اند، ارث ببرید. در مورد مسایل مربوط به وراثت و ارث بری باید منتظر مقاله های بعدی بمانید. در ضمن طی این مقالات کم کم با مزایای کلاس های جدید آشنا می شوید. حالا اجازه بدهید به مثال خودمان برگردیم.

توضیح مثال

در خط اول از مثالمان ما توسط کلید واژه ی class شی ایی با نام CdPlayer را تعریف کردیم. و چون این شی از object ارث برده است پس جزو کلاس های جدید محسوب میگردد و امکان استفاده از مزایای آن را خواهد داشت.

در خط بعد شما یک متد مخصوص به نام __init__ را مشاهده میکنید. به حالت عادی شما نباید از خود کلاس اصلی استفاده کنید و برای استفاده از آن کلاس باید نمونه ای از همان کلاس را ایجاد کنید. در مقالات بعدی با نمونه سازی کلاس هم آشنا می شوید. اما فعلا همین قدر بدانید که هر کلاسی هنگام نمونه سازی به طور اتوماتیک عکس العملی از خود نشان میدهد. این عکس العمل فراخانی متد مخصوص __init__ است که برای مقدار دهی و اعمال تنظیمات اولیه کلاس به کار میرود. تنظیماتی که ما هنگام ساخت این شی به آن ها احتایج داشتیم در این متد اعمال شده اند. حتما توجه کرده اید که لسیت پارامترهای هر کدام از متدهای این کلاس با پارامتر self شروع شده است. self ارجاعی به خود کلاس است و وقتی از self استفاده میکنیم یعنی داریم به خود کلاس اشاره میکنیم. تمام متدهای تعریف شده در کلاس باید با پارامتر self شروع شوند تا نشان دهند که به کلاس ما وابسته اند.

در متد __init__ ما با استفاده از self که به خود کلاس اشاره میکند، دو متغیر برای کلاسمان تعریف کردیم. یکی به نام volume که با مقدار ۲۰ ارزش دهی شده است و دیگری currentSong که نشان دهنده ی شماره ی آهنگ فعلی است.

متد بعدی متد setVolume است که باز هم با استفاده از self به متغیر volume اشاره میکند و مقدار آن را تغییر میدهد. هر وقت بخواهیم از درون یکی از متد های کلاسمان متغیری را فراخانی کنیم باید از self برای فراخوانی آن استفاده کنیم. این قانون در مورد فراخانی متدها هم صادق است.

حالا که متوجه اصل ماجرا شده اید حتما خودتان میتوانید طرز کار دیگر متدهای کلاس را حدس بزنید. یا بیایید حدس زدن ساختار بقیه متدها را به عنوان تمرین شما به حساب بیاوریم که باید توسط خود شما حل شود. مطمئنا کار ساده ایست.

نتیجه گیری

خب تا این جای این سری مقالات شما با شی گرایی، کلاس ها و طرز کار آن ها، متغیر ها و متدهای کلاس، متد مخصوص __init__ و واژه ی self آشنا شدید. اما نکته ای که باید بدانید این است که این دو مقاله حتی به عنوان یک مقدمه بر مبحث شی گرایی پایتون هم به حساب نمی آیند، پس باید منتظر سری بعدی مقالات باشید. در حقیقت این دو مقاله فقط به عنوان شروعی کوچک بود؛ کار شما تازه از الآن شروع می شود!


صفحه قبلی: پایتون
صفحه بعدی: PyGTK