پایتون یک زبان برنامهنویسی تفسیری، سطح بالا، شیءگرا و همچنین یک زبان تفسیری سمت سرور قدرتمند است که توسط گیدو ون روسوم در سال ۱۹۹۰ ساخته شد.این زبان در ویژگیها شبیه پرل، روبی (رابی)، اسکیم، اسمالتاک و تیسیال است و از مدیریت خودکار حافظه استفاده میکند.پایتون به شکل پروژهای متنباز توسعه یافته است و توسط بنیاد نرمافزار پایتون مدیریت میگردد و نسخهٔ ۲.۴.۶ این زبان در تاریخ ۲۵ اکتبر ۲۰۰۹ منتشر شد.
نوشتن این زبان برای اولین بار در سال ۱۹۹۰ توسط فردی به نام گویدو ون رسوم کلید خورد. پایتون در یک محیط آموزشی ایجاد و توسعه یافته است. یعنی در کریسمس سال ۱۹۸۹ (میلادی) در مؤسسۀ ملی تحقیقات ریاضی و رایانۀ شهر آمستردام.در آن زمان گیدو یک محقق درCWIبود و در زمان بیکاری خود روی پروژۀ شخصیاش یعنی پایتون کار میکرد. اولین نسخۀ عمومی از پایتون در ماه فوریۀ سال ۱۹۹۱ منتشر شد. برای مدتی نسبتاً طولانی پایتون توسط مؤسسۀ ملی تحقیقات و ابتکارات(CNRI)واقع در رستون ایالات متحدۀ امریکا توسعه مییافت.تا اینکه در سال ۲۰۰۰ تیم توسعهدهندۀ پایتون به آزمایشگاههای پایتون منتقل شدند. نام پایتون از برنامۀ مورد علاقۀ سازندۀ آن یعنی مونتی پایتون که یک برنامۀ کمدی انگلیسی بود گرفته شده است.
ویژگیهای پایتون
-
شیءگرایی
پایتون یک زبان برنامهنویسی شیءگرا است و از ویژگیهای پیشرفتهای چون وراثت، چندشکلی، سربارگزاری عملگر و … پشتیبانی میکند. یکی از ویژگیهای پایتون که لقب چسب را برای پایتون به ارمغان آورده امکان استفاده از کدها و کلاسهای نوشته شده در زبانهای دیگری چون سیپلاسپلاس وجاوااستکه در حقیقت کارچسباندن قطعات کد جدا و فقط نوشتن بدنه اصلی به عهدۀ پایتون است.
-
آزاد
پایتون یک زبان برنامهنویسی آزاد و متنباز است. میتوانید متنآنو خود برنامه را از اینترنت دریافتی درتوسعۀ آن همکاری کرد.
-
قابلیت حمل
چون پایتون با زبان قابل حمل Cنوشته شده میتواند بهصورت مجازی برروی هرپردازش کرد یا اجراشود. ماشینمجازی (مفسر پایتون)متن برنامه را خوانده وهم زمان تفسیرکرده و اجرا میکند. بنابراین شما میتوانید یک برنامه رادر ویندوز بنویسید و سپس بدون تغییر رویلینوکسیامکینتاش یاهرسیستم عامل و سختافزاردیگریکه پایتون رویآن نصب باشد اجرا کنید.
-
قدرتمند
پایتون زبانی چندرگه است که از زبانهای برنامهنویسی تفسیری (برای مثال: تیسیال، اسکیم، پرل)وزبانهای سیستمی (برایمثال: سیپلاسپلاس، سی و جاوا) مشتق شده. بنابراین تمامس ادگیوراحتی کار زبانهای برنامه نویسی تفسیری و ویژگیها وقدرت زبانهای سطحپایین را داراست.
-
درونیسازی و گسترش
این ویژگی یکی از پرکاربردترین و قویترین ویژگیهای پایتون است. شما میتوانید یک قطعه از کد را در زبانی چون سیپلاسپلاس، سیوجاوا نوشته سپس ازآندربرنامۀ نوشتهشده با پایتون استفادهکنید. ویامیتوان ازتوابع کتابخانهای وکامپوننتهاییچون COM , APIاستفادهکرد.البته سبک این نوع برنامهنویسی (ماژول) با برنامهنویسی معمولی هر زبان متفاوت است. میتوان از کدهای پایتون در زبانهای دیگر نیز استفاده کرد.
-
سهولت یادگیری و استفاده
بیشک و حداقل از نظر بسیاری از برنامهنویسان، این زبان یکی از آسانترین زبانها برای یادگیری و استفاده است. از آن به عنوان یک زبان سریع برنامهنویسی یاد میکنند. این زبان نیازی به کامپایلر ندارد و شما مستقیماً میتوانید پس از نوشتن کد و با یک دستور آن را اجرا کنید. دستورات این زبان بسیار نزدیک به زبان انسان است.
برای مثال برنامۀHello Worldکه اولینبرنامۀساده است، رادردوزبان سیو پایتون مقایسه کنید:
Hello World درC#:
۱ ۲ ۳ ۴ ۵ ۶ |
#include <stdio.h> int main() { printf(" Hello world "); return ۰; } |
در پایتون:
۱ |
print "Hello World !!" |
اهمیت پایتون
مطمئن هستم با اهمیت لینوکس و نرم افزار های متن باز در ایران آشنا هستید. همانطور که می دانید سیستم عامل ملی ما بر پایه لینوکس می باشد و این لازمه توسع برنامه نویسی تحت لینوکس را برایمان آشکار می کند. شاید فکر کنید زبان برنامه نویسی و انتخاب اکثر لینوکس کاران C می باشد. این تفکر درستی است اما نه برای برنامه ملی و کاربردی مانند یک برنامه حسابداری. پایتون در سراسر دنیا از اهمیت ویژهای برخوردار می باشد و رفته رفته به جایگاه اصلی و لایق خود نزدیک می شود. جالب است بدانید مایکروسافت نیز این زبان را با نام IronPythonدر تکنولوژی Net. خود گنجانده است.
مفهوم شیءگرایی در پایتون

برای برنامهنویسی شیءگرا در هر زبانی ابتدا باید مفهوم اصلی شیءگرایی را درک کرد. شیءگرایی ابزار و یا خصوصیت خاص یک زبان برنامهنویسی نیست؛ حتی در زبانی مثلCهم که از امکانات شیءگرایی برخوردار نیست، باز هم امکان برنامهنویسی شیءگرا وجود دارد. نمونهای بارز از این گونه برنامهها، کتابخانۀ معروفGTKاست که بهصورت شیءگرا درCپیادهسازی شده است. در حقیقت شیءگرایی نوعی طرز تفکر خاص در پیادهسازی برنامهها است. به این صورت که برنامهنویس با قسمتهای مختلف برنامهاش دقیقاً همانند اشیای عادی در دنیای حقیقی رفتار میکند و سعی میکند با کنار هم قرار دادن آنها برنامۀ خود را به سرانجام برساند.
مثالهایی از دنیای واقعی
مثال ۱نجاری را در نظر بگیرید که برای ساخت یک میز باید از اشیای مختلفی مثل میخ، چکش، اره و… استفاده کند. هر کدام از این ابزارها اشیای جداگانهای هستند که بدون دخالت در کار یکدیگر به ساخت میز مورد نظر نجار کمک میکنند. چکش میخ را میکوبد بدون این که از ماهیت میخ با خبر باشد، اره چوب را تکهتکه میکند بدون این که در کار چکش دخالت کند،در نهایت حاصل کار میزی خواهد بود؛ که نجار با استفاده از این ابزارها پدید آورده است. در حقیقت نجار برای ساخت میز خود از اشیای مختلفی که هر کدام ماهیت و خصوصیات خاص خودشان را دارند کمک گرفت.
مثال ۲فرض نمایید که ما قصد داریم قطعهای را بهطور انبوه تولید نماییم. یک روش آن است که ما این قطعات را یکبهیک تراش دهیم ولی این کار ممکن است ماهها و شاید سالها زمان برد. و اگر نتیجه کار را هم بررسی نماییم ملاحظه میکنیم که قطعات همگی یکشکل و یکدست نیستند همچینین هزینۀ تمام شدۀ آن هم بسیار بالا خواهد بود. اما روش بهتری نیز وجود دارد و آن این است که ما یک قالب برای آن قطعه بسازیم و بعد با استفاده از آن قالب قطعات مورد نیاز خود را تولید نماییم. پس اگر ما فقط در ساختن قالب دقت لازم را به خرج دهیم، در پایان کار مشاهده میکنیم که قطعات تولید شده همگی یکشکل و یکدست از آب درآمدهاند. در برنامهنویسی شیءگرا هم در واقع از این روش استفاده میشود ما یک قالب (کلاس) میسازیم و آن را امتحان میکنیم تا از درستی طرز کار آن مطمئن شویم. سپس از آن بارها استفاده مینماییم.
مزایای شیءگرایی
شیءگرایی در دنیای برنامهنویسی هم به همین صورت است. برنامهنویس در طول کار خود اشیای مورد نیاز خود را ایجاد میکند و یا از اشیای آمادهای که توسط برنامهنویسان دیگر ایجاد شده است استفاده میکند تا با در کنار هم قرار دادن آنها، برنامهای را بهوجود آورد که از اشیای مختلفی تشکیل شده است. این روش مزیتهای زیادی دارد که در زیر چند نمونه از اصلیترین آنها را با هم مرور میکنیم:
-
بهینه شدن ساختار برنامه:
شیءگرایی باعث تولید برنامههای خوشساختتری میشود و امکان تغییر و توسعه در برنامه را سادهتر میکند. مثال: اگر بخواهید قسمت خاصی از برنامه را تغییر دهید، دیگر لازم نیست تمام کدهای برنامه را ویرایش کنید چون میدانید که تغییرات شما فقط در همان قسمت مدنظرتان اعمال میشود و خللی در کار قسمتهای دیگر بهوجود نمیآید
-
استفادۀ مجدد از کدها:
وقتی شما یک شی جدید را خلق میکنید، میتوانید تا مدتها از آن استفاده کنید و یا آن را با دیگران به اشتراک بگذارید. این مزیت هنگام ساخت کتابخانههای شیءگرا بسیار کارآمد است. بهعنوان مثال یک دوچرخه میتواند تا مدت زمان زیادی به شما سواری دهد. همچنین میتوانید برای سواری آن را به دوستانتان هم قرض بدهید.
-
کپسولهسازی:
در برنامهنویسی هر چه اشیای تشکیل دهندۀ یک برنامه از طرز کار یکدیگر بیخبرتر باشند، برنامۀ شما ساختار بهتری پیدا خواهد کرد. زیرا در این شرایط اشیا در کار یکدیگر دخالت نمیکنند. با استفاده از شیءگرایی قسمتهای مختلف برنامۀ شما از نحوۀ کار همدیگر بیخبرند و این مسأله در حالی اتفاق میافتد که شما به عنوان برنامهنویس از طرز کار آنها اطلاع دارید.مثال:یک نجار میداند که فرورفتن میخ در چوب، به خاطر نوک تیز بودن آن است. اما چکشی که روی میخ میکوبد از نحوۀ فرورفتن میخ در چوب بیخبر است. وظیفۀ چکش فقط کوبیدن میخ است. در حقیقت وظیفۀ چکش فقط کوبیدن است، یک کوبیدن خالص!یعنی بهتر است که چکش حتی از شیءای که به آن نیرو وارد میکند هم بیخبر بماند. به زبان دیگر چکش فقط باید ضربه بزند، این که شیء ضربدیده میخ باشد یا دیوار، دیگر در حیطۀ معلومات چکش نمیگنجد!
-
وراثت:
این قابلیت دقیقاً متناسب با نامش عمل میکند. یعنی اگر یک شیء «الف» از شیء «ب» ارث ببرد، یک سری از خصوصیات شیء «ب» به شیء «الف» وارد میشود. در برنامهنویسی به شیء «الف» فرزند، و به شیء «ب» والد گفته میشود.
مثال:
فرزندی که به دنیا میآید اصولاً یک سری از خصوصیات ظاهری و یا رفتاری پدر خودش را به ارث خواهد بردحالا که با تعدادی از مزایای اصلی شیءگرایی آشنا شدید، مطمئناً اشتیاق برنامهنویسان به برنامههای شیءگرا را درک خواهید کرد
مفهوم کلاس در پایتون

شیءگرایی در برنامهنویسی دقیقاً همانند کار با اشیا در دنیای واقعی است. در دنیای واقعی اشیا، قابل لمس و حقیقی هستند. به همین دلیل میتوانیم خیلی راحت با آنها تعامل برقرار کنیم، اما در دنیای مجازی اوضاع به همین منوال نیست. برای مثال شما نمیتوانید یک دوچرخه یا یک ماشین را به صورت فیزیکی به برنامه وارد کنید! اما میتوانید توسط ساختارهای خاص برنامهنویسی آنها را با کدهایتان پیادهسازی کنید. ساختاری که وظیفۀ پیادهسازی اشیا در دنیای برنامهنویسی را به عهده دارد، «کلاس» نامیده میشود. به زبان سادهتر، اشیا در دنیای برنامهنویسی به صورت کلاس تعریف میشوند.
طرز کار کلاسها
اما طرز کار کلاس چگونه است؟ کلاس چگونه قادر به پیادهسازی اشیا میشود؟ جواب آنقدرها هم سخت نیست. به حالت عادی هر شیء در دنیای واقعی با سه جنبۀ اصلی شناخته میشود:
- نام شیء
- وضعیت شیء
- رفتار شیء
مثلا یک سیدیپلیر را در نظر بگیرید:
نام این شیء سیدیپلیر است. این شی میتواند سیدیای را اجرا کند، بین آهنگهای سیدی حرکت کند و غیره… اینها رفتاری هستند که از یک سیدیپلیر بر میآید.اما منظور از وضعیت این شیء چیست؟ سیدیپلیر مقدار بلندی صدا را کنترل میکند و یا میداند در حال حاضر چه مقدار از ادامۀ آهنگ باقی مانده است. مثلاً میگوییم بلندی پلیر در حال حاضر روی درجۀ ۳۰ است. این یعنی وضعیت صدای پلیر ما روی ۳۰ تنظیم شده است.کلاسها علاوهبر این که نامی را برای اشیا در نظر میگیرند، میتوانند وضعیت اشیا را توسط متغیرهای کلاس و رفتار آنها را توسط متدهای کلاس پیادهسازی کنند. متغیرهای کلاس، متغیرهایی هستند که درون بدنۀ آن کلاس تعریف شدهاند تا نگهدارندۀ وضعیت و اطلاعات آن کلاس باشند. متدها هم همان توابع عادی هستند که وقتی در بدنۀ کلاس تعریف میشوند مسئولیت پیادهسازی رفتار کلاس را به عهده میگیرند. حالا که متوجه طرز کار ساختار کلاس شدید، در قسمت بعد سعی میکنیم همین شیء سیدی پلیر را با این ساختار پیادهسازی کنیم.
پیادهسازی کلاسها
در این قسمت قصد داریم ساختار سیدی پلیر را توسط یک کلاس پیادهسازی کنیم. بهتر است ابتدا کدهایمان را بنویسیم و سپس درمورد تک تک خطهایمان توضیح دهیم. این فقط یک مثال ساده است پس ما قرار نیست زیاد به جزئیات توجه داشته باشیم. در حال حاظر شما باید سعی کنید بیشتر از طرز کار کدها، به ساختاربندی کدها توجه کنید:
کد کلاس پخشکننده سیدی تصویری:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ |
class CdPlayer(object): def __init__(self): self.volume = ۲۰ self.currentSong = ۰ def setVolume(self, newValue): self.volume = newValue def play(self, trackNumber): #operation for palying songs def nextSong(self): self.currentSong += ۱ self.play(currentSong) def previousSong(self): self.currentSong -= ۱ self.play(currentSong) |
افراد مبتدی در پایتون به احتمال زیاد از طرز تعریف کردن این کلاس تعجب کردهاند. بله تعریف این کلاس با تعریف کلاسهای عادی پایتون فرق دارد. در مقالۀ اول به شما قول داده شد بود که تمام مباحث این سلسله مقالات بر پایۀ کلاسهای سبک جدید پایتون(new-style classes)خواهد بود. پس بگذارید قبل از این که به موشکافی مثالمان بپردازیم مقداری هم راجع به کلاسهای سبک جدید توضیح دهیم. کلاسهای سبک جدیددر پایتون تمام اجزای اصلی زبان به صورت اشیا پیادهسازی شدهاند. از متغیرها و توابع و انواع دادههای اصلی مثلintبگیرید تا خود کلاسها. بله، حتی خود کلاسها هم بهصورت اشیا تعریف شدهاند. طبق تصمیماتی که مبنی بر یکپارچهسازی اشیای زبان و اشیای تعریف شده از طرف برنامهنویسان صورت اتخاذ شد، تمام اشیای اصلی زبان پایتون از یک شیء واحد و برتر به نام objectساخته میشوند و یا به عبارت دیگر ارث میبرند. این مسأله چند سالی است که در پایتون اتفاق افتاده است اما به علت عادت قدیمی برنامهنویسان به کلاسهای عادی و همچنین نبود مستندات کافی برای تشریح کلاسهای جدید، هنوز کلاسهای سبک جدید فراگیر نشدهاند. به هر حال در نسخههای آیندۀ پایتون خبری از آن کلاسها قدیمی نیست و این کلاسهای جدید جایگزین آنها خواهند شد پس بهتر است که در یادگیری آنها عجله کنید.کلاسهای شما اگر به صورت عادی تعریف شوند از کلاسهای کلاسیک و قدیمی پایتون محسوب میشوند. اما اگر میخواهید کلاس شما به صورت سبک جدید تعریف شود و از مزایای زیاد این گونه کلاسها بهرهمند شود، باید به هنگام تعریف کلاس خود از شیء برترobjectو یا اشیایی که از آن ارث بردهاند، ارث ببرید. در مورد مسائل مربوط به وراثت و ارثبری به مقالات بعدی مراجعه کنید. در ضمن طی این مقالات بهتدریج با مزایای کلاسهای جدید آشنا میشوید. حالا اجازه بدهید به مثال خودمان برگردیم.
توضیح مثال:
در خط اول از مثالمان ما توسط کلید واژۀclassشیئی با نامCdPlayerرا تعریف کردیم. و چون این شیء از object ارث برده است پس از کلاسهای جدید محسوب میشود، و امکان استفاده از مزایای آن را خواهد داشت.در خط بعد شما یک متد مخصوص به نامinitرا مشاهده میکنید. در حالت عادی شما نباید از خود کلاس اصلی استفاده کنید و برای استفاده از آن کلاس باید نمونهای از همان کلاس را ایجاد کنید. در مقالات بعدی با نمونهسازی کلاس هم آشنا میشوید. اما فعلا همینقدر بدانید که هر کلاسی هنگام نمونهسازی به طور اتوماتیک عکسالعملی از خود نشان میدهد. این عکس العمل فراخوانی متد ویژۀاست که برای مقداردهی و اعمال تنظیمات اولیۀ کلاس بهکار میرود. تنظیماتی که ما هنگام ساخت این شیء به آن ها نیاز داشتیم در این متد اعمال شدهاند. حتما توجه کردهاید که لسیت پارامترهای هرکدام از متدهای این کلاس با پارامترselfشروع شده است.selfارجاعی به خود کلاس است و وقتی ازselfاستفاده میکنیم یعنی داریم به خود کلاس اشاره میکنیم. تمام متدهای تعریف شده در کلاس باید با پارامترselfشروع شوند تا نشان دهند که به کلاس ما وابستهاند.در متدinitما با استفاده ازselfکه به خود کلاس اشاره میکند، دو متغیر برای کلاسمان تعریف کردیم. یکی به نامvolumeکه با مقدار ۲۰ ارزشدهی شده است و دیگریcurrentSongکه نشان دهندۀ شمارۀ آهنگ فعلی است.متد بعدی متدsetVolumeاست که باز هم با استفاده از self به متغیرvolumeاشاره میکند و مقدار آن را تغییر میدهد. هر وقت بخواهیم از درون یکی از متدهای کلاسمان متغیری را فراخوانی کنیم باید ازselfبرای فراخوانی آن استفاده کنیم. این قانون در مورد فراخوانی متدها هم صادق است.
مفهوم اشیا در پایتون
برای استفاده از مفهوم اشیا باید اشیای خود را نمونهسازی کنیم یعنی به زبان سادهتر از شیء اصلی خود یک کپی بسازیم. مثلا شما هنگامی که نیاز به استفاده از شناسنامۀ خود داشته باشید، اصولاً سعی میکنید از کپی آن استفاده کنید و اصل شناسنامه را با خود حمل نکنید. در مورد اشیا هم این قانون حاکم است. شما میتوانید تا هر چقدر که دلتان بخواهد از روی شیء اصلی خود نمونهسازی کنید.این نمونهها به صورت کاملاً مستقل عمل میکنند. مثلا اگر از روی شیء CdPlayerکه در مقالۀ قبل ایجاد کردیم دو نمونه به نامهایmyPlayer1و myPlayer2بسازیم، هیچکدام از این اشیا به هنگام استفاده در کار یکدیگر دخالتی نمیکنند. میزان صدا میتواند برایmyPlayer1روی ۴۰ تنظیم شود در حالی که میزان بلندی صدایmyPlayer2روی ۶۰ تنظیم شده است.
وراثت در پایتون
به صورت گذرا در مقالههای قبلی به وراثت اشاره کرده بودیم اما در این مقاله میخواهیم این موضوع را یه کمی بیشتر موشکافی کنیم. وراثت از معدود کلمات کامپیوتری به حساب میآید که معنی آن دقیقاً برابر با همان معنی انگلیسیاش است. یعنی وقتی میگوییم کلاسBاز کلاسAارث میبرد، یعنی به طور اتوماتیک یک سری از خصوصیاتAدر کلاسBگنجانده میشود. درست مانند کودکی که امکان دارد رنگ چشم یا موهایش را از خانوادهاش به ارث ببرد.
به مثال زیر توجه کنید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ |
class A(object): def sayHello(self): print "Hello A!" class B(A): pass b = B() b.sayHello() |
در مثال بالاAکلاسی است که یک متد تعریف شده به نامsayHelloرا در خود جای داده است. هنگام تعریف کلاسBما مشخص کردیم کردیم که این کلاس باید ازAارث ببرد، بنابراین به طور اتوماتیک متدsayHelloکه اصلاً درBوجود ندارد، به کلاسBاضافه میشود.اگر متدی با همین نام در کلاسBهم تعریف شده بود، متدsayHelloکه مربوط به کلاسAاست اجرا نمیشد و هنگام فراخوانی، از متد تعریف شده در کلاس B استفاده میشد. در چنین وضعیتی میگوییم متدsayHelloی موجود در کلاسB، متدsayHelloی موجود در کلاسAرا لغو کرده است. باید به این نکته توجه کنیم که چون خودAاز شی اصلیobjectارث برده است، پس تمام کلاسهایی که از آن ارث میبرند (مانند(Bو هم خود به خود در دستۀ کلاسهای سبک جدید پایتون جای میگیرند.