مقدمه
سالها تدریس یک چیز را به من ثابت کرده: بیشتر کسانی که در میانهی یادگیری شیءگرایی رها میکنند، مشکلشان شیءگرایی نیست — مشکلشان یک حفرهی کوچک در پیشنیازهاست که هیچکس به آنها نگفته بود. بارها دیدهام که دانشجو بهخاطر ضعف در پایه، مفاهیم پیشرفتهتر را یاد نمیگیرد و گمان میکند استعدادش را ندارد، در حالی که فقط یک آجرِ جاافتاده کم داشته است.
این فصل برای همین نوشته شده، اما با یک تفاوت مهم نسبت به بقیهی دوره: اینجا نه شیءگرایی یاد میگیریم و نه سینتکس پایهی پایتون را قدمبهقدم آموزش میدهیم. فرض ما این است که مقدمات پایتون را جای دیگری یاد گرفتهاید؛ کاری که در این فصل انجام میدهیم سه چیز است: نخست، دقیقاً و بهصورت یک چکلیست فهرست میکنیم که پیش از شروع باید چه چیزهایی را بلد باشید تا خودتان صادقانه بسنجید کجای کار ایستادهاید. سپس دربارهی تایپهینتها یک توصیهی کوتاه میکنیم. و در پایان، نقشهی کامل مسیر را پهن میکنیم تا بدانید قرار است از کجا به کجا برسید.
بنابراین دو حالت پیش رو دارید:
- اگر جلوی موارد چکلیست به تردید افتادید، یعنی هنوز زمینِ زیر پایتان کاملاً سفت نیست. جای نگرانی نیست؛ همان چند مورد را جدا تمرین کنید و بعد برگردید. این برگشتن، عقبماندن نیست — کوتاهترین راه است.
- اگر با پایتون راحتید، چکلیست را سریع مرور کنید و مستقیم بروید سراغ آزمون خودسنجی. اگر بالای ۸۰٪ درست جواب دادید، این فصل را رد کنید و از فصل اول شروع کنید.
چرا این دوره به فصل صفر نیاز دارد؟
چون تقریباً همهی دورههای شیءگرایی — فارسی و خارجی — با این جمله شروع میشوند: «فرض میکنیم با مقدمات پایتون آشنایید.» و همین فرضِ نانوشته، دیوار نامرئیای میسازد که خیلیها پشتش جا میمانند؛ چون هیچکس دقیق نگفته که این «مقدمات» یعنی چه.
ما این دیوار را برمیداریم، اما نه با آموزشِ دوبارهی سینتکس. راهِ بهتر این است که آن فرضِ نانوشته را صریح کنیم: بهجای اینکه مبهم بگوییم «باید پایتون بلد باشید»، مو به مو نام میبریم که کدام مهارتها لازماند و هرکدام بعداً به کجای دوره وصل میشوند. با این کار، هم میتوانید خودتان را دقیق بسنجید و هم میفهمید چرا این چند چیزِ بهظاهر ساده، تا آخر دوره همراهتاناند.
پیشنیازها: چه چیزهایی را باید از قبل بلد باشید؟
فهرست واقعی کوتاهتر از چیزی است که فکرش را میکنید. لازم نیست پایتونکارِ حرفهای باشید؛ فقط کافی است جلوی هر یک از موارد زیر بتوانید با خیال راحت بگویید «بله، این را بلدم». هرجا مکث کردید، همان نقطهی دقیقی است که باید قبل از ادامه رویش کار کنید.
ابزار و اجرا
- پایتون ۳.۱۰ یا جدیدتر نصب دارید و میدانید نسخهتان را چطور بررسی کنید. (این دوره از سینتکسهایی مثل
X | Yدر تایپهینتها استفاده میکند که در نسخههای قدیمیتر کار نمیکنند.) - میتوانید یک فایل
.pyرا اجرا کنید و بلدید با حالت تعاملی (REPL) یک قطعهکد کوتاه را سریع امتحان کنید.
متغیرها و انواع پایه
- با انواع پایه (
int،float،str،bool،None) راحتید و میتوانید با f-string از روی متغیرها رشته بسازید. - دو تصویر ذهنی را همراه دارید: متغیر یک برچسب است، نه جعبه؛ و در پایتون همهچیز شیء است، حتی یک عدد ساده. (سرِ
selfدر فصل دوم و سرِ حافظه در فصل چهاردهم، دقیقاً به همین دو تکیه میکنیم.)
ساختارهای داده
- میدانید
list،dict،tupleوsetهرکدام برای چه نیازی ساخته شدهاند و کِی باید کدام را انتخاب کنید. - با دیکشنری راحتید — پیمایشِ کلید و مقدار، و گرفتنِ امنِ مقدار با مقدار پیشفرض. (در فصل دوم میبینید که attributeهای هر شیء واقعاً در دیکشنریای به نام
__dict__نگهداری میشوند، پس این آشنایی زود به کارتان میآید.) - تفاوت دادهی تغییرپذیر (mutable مثل
listوdict) و تغییرناپذیر (immutable مثلtupleوstr) را میدانید. (این تفاوت در فصل چهاردهم و در یکی از رایجترین باگهای شیءگرایی — «اشتراک ناخواستهی داده» — نقش پررنگی دارد.)
شرط و حلقه
- با
if/elif/else، حلقههایforوwhile، و ابزارهای پرکاربردی مثلrange، تستِ عضویت باin،break/continueو شرطِ فشرده (ternary) راحتید و میتوانید با آنها منطق یک مسئلهی ساده (مثلاً پردازش فهرستی از سفارشها) را پیاده کنید.
توابع — مهمترین پیشنیاز
اگر قرار باشد فقط روی یک ردیف از این چکلیست بیشترین وقت را بگذارید، همین است؛ چون کل فصل دوم به بعد روی توابع سوار میشود.
- میتوانید تابع تعریف کنید، به آن ورودی بدهید و با
returnخروجی بگیرید — و تفاوتِ حیاتیreturn(که مقدار را برمیگرداند تا بقیهی برنامه با آن کار کند) باprint(که فقط نمایش میدهد) برایتان روشن است. - با پارامترِ پیشفرض راحتید (در سازندههای کلاس در فصل دوم زیاد میبینیدشان).
- میدانید
*argsو**kwargsتقریباً یعنی چه (تا در فصلهای چهارم و پنجم که جدی ظاهر میشوند، غافلگیر نشوید). - این نکته را میدانید که خودِ توابع هم شیء هستند — میشود آنها را در متغیر ریخت یا به تابع دیگری پاس داد. (همین یک ویژگی است که «دکوراتور» را در فصل پنجم ممکن میکند.)
و یک جمله که کل نیمهی اول دوره روی آن بنا شده و ارزش دارد همین حالا در ذهنتان بنشیند: متد چیزی نیست جز تابعی که داخل یک کلاس زندگی میکند. به همین دلیل است که هرچه توابع را محکمتر بلد باشید، نیمی از راهِ شیءگرایی را از پیش آمدهاید.
جمعبندی این بخش ساده است: اگر جلوی تقریباً همهی موارد بالا توانستید «بله» بگویید، آمادهاید و آزمون خودسنجی این آمادگی را دقیقتر میسنجد. اگر جلوی چند مورد مکث کردید، همان چند مورد نقشهی تمرینِ این هفتهی شماست — نه بیشتر.
تایپهینتها: بلد باشید بهتر است، ولی اجباری نیست
یک توصیهی جداگانه که خارج از چکلیست بالا میماند، چون از جنس «خوب است بلد باشید» است نه «باید بلد باشید». از فصل نهم به بعد — جایی که سراغ Protocolها، Genericها و مدلهای دادهی مدرن میرویم — تایپهینتها در کدها زیاد ظاهر میشوند؛ چیزی شبیه def area(radius: float) -> float: که جلوی هر ورودی و خروجی، نوعِ انتظاریاش را اعلام میکند.
بلدبودنِ تایپهینتها جزو پیشنیازهای اجباری این دوره نیست؛ اگر با آنها آشنا نباشید هم میتوانید دوره را دنبال کنید. اما اگر خواندنشان را بلد باشید، آن فصلها را روانتر و عمیقتر میفهمید، چون منظورِ کد را یکنگاهه میگیرید. پس اگر فرصتش را دارید، یک آشناییِ مقدماتی با تایپهینتها سرمایهگذاری خوبی است — و اگر نه، اصلاً نگران نباشید؛ هرجا که لازم شد، همانجا توضیحش میدهیم.
مهارت پنهان: خواندن Traceback
این یک مورد را جدا از چکلیست آوردهام، چون تقریباً هیچ دورهای درسش نمیدهد و اتفاقاً یکی از پرتکرارترین دلایل گیرکردنِ تازهکارهاست. وقتی برنامه خطا میدهد، پایتون یک Traceback چاپ میکند. بیشتر مبتدیها با دیدنش وحشت میکنند و کلش را نادیده میگیرند؛ در حالی که Traceback بهترین دوست شماست و دقیقاً میگوید چه شد و کجا.
Traceback (most recent call last):
File "shop.py", line 5, in <module>
get_price(item)
File "shop.py", line 2, in get_price
return product["price"]
~~~~~~~^^^^^^^^^
KeyError: 'price'
راهِ خواندنش — از پایین به بالا:
- خط آخر، نوع و پیام خطاست:
KeyError: 'price'یعنی کلیدpriceدر دیکشنری نبود. - یکی مانده به آخر، محل دقیق وقوع: فایل
shop.py، خط ۲، داخل تابعget_price. - خطهای بالاتر، مسیرِ رسیدن به آنجا: چه کسی این تابع را صدا زده بود (خط ۵).
از فصل چهارم به بعد که با استثناها کار میکنیم و در فصل یازدهم که استثنای سفارشی میسازیم، این مهارت طلا میشود. عادت کنید: خطا دیدید، اول خط آخر، بعد مسیر.
نقشهی راه دوره: از اینجا به کجا میروید؟
حالا که پیشنیازها روشن شد، بیایید کل مسیر را از بالا ببینیم. دوره سه پرده دارد:
| پردهی اول: پایهها و تفکر | پردهی دوم: طراحی حرفهای | پردهی سوم: عمق و ساخت |
|---|---|---|
| ۱. فلسفه و تاریخچه | ۷. Composition و معماری | ۱۴. مدیریت حافظه |
| ۲. کلاس، شیء، self، سازنده | ۸. اصول SOLID | ۱۵. Descriptorها |
| ۳. تفکر شیءگرا | ۹. ABC، Protocol، Generics | ۱۶. متاکلاسها |
| ۴. اصول چهارگانه | ۱۰. مدلهای داده مدرن | ۱۷. Performance و async |
| ۵. Property و متدهای جادویی | ۱۱. استثناها و سریالسازی | ۱۸. ماژولها و پکیجها |
| ۶. ارثبری پیشرفته و MRO | ۱۲. الگوهای طراحی | ۱۹-۲۴. شش پروژهی واقعی |
| ۱۳. تستنویسی |
این جدول سه ستون دارد که هرکدام نشاندهندهی یک پرده از دورهاند و سرفصلهای مرتبط با هر پرده در سطرهای مربوطه قرار گرفتهاند.
منطق چینش ساده است: اول نوشتن یاد میگیرید (پردهی اول)، بعد خوب نوشتن (پردهی دوم)، بعد عمیق فهمیدن و واقعی ساختن (پردهی سوم). هر فصل روی فصلهای قبلش سوار میشود؛ برای همین پیشنهاد میکنم ترتیب را بههم نزنید، حتی اگر وسوسه شدید یکراست بروید سراغ متاکلاسها.
و شش پروژهی پایانی، جایی است که همهچیز به هم گره میخورد: سیستم کتابخانه، سیستم پرداخت، سیستم رزرو، و بعد سه پروژهی خاص که کمتر جایی مشابهش را میبینید — ساختن ORM شخصی، ساختن فریمورک تست، و یک موتور اعلان event-driven. وقتی به آنجا برسید، دیگر «کاربر» ابزارها نیستید؛ میفهمید خودِ Django و pytest از چه جادویی ساخته شدهاند — و آن جادو را خودتان بلدید.
چطور از این دوره بیشترین بهره را ببرید؟
چند توصیه:
تایپ کنید، اجرا کنید، خراب کنید. هر بلاک کد را خودتان تایپ و اجرا کنید، بعد عمداً چیزیاش را عوض کنید و ببینید چه میشود. انگشتها چیزهایی یاد میگیرند که چشمها یاد نمیگیرند؛ و کسی که کد را «میشکند و میسازد» با کسی که فقط «میخواند» در پایان دوره دو آدم متفاوتاند.
تمرینها اختیاری نیستند. هر فصل یک فایل تمرین دارد و یک فایل پاسخِ تشریحی. اول بدون نگاهکردن به پاسخ تلاش کنید — حتی اگر غلط، حتی اگر ناقص. مغز فقط چیزهایی را نگه میدارد که برایشان عرق ریخته.
آهسته و پیوسته. یک فصل در روز (همراه با تمرینهایش) آهنگ خوبی است. سه فصل در یک شب، فقط توهمِ پیشرفت میسازد.
سوال «چرا» را رها نکنید. هرجا نوشتیم «این Tradeoff دارد»، مکث کنید. حفظکردن راهحلها شما را برنامهنویس نمیکند؛ فهمیدنِ «چرا این و نه آن» میکند. کل این دوره حول همین سوال طراحی شده است.
خلاصه
- این فصل سینتکس پایه را آموزش نمیدهد؛ فرض بر این است که آن را از قبل بلدید. کارِ اینجا این است که پیشنیازها را بهصورت یک چکلیستِ صریح روشن کند تا خودتان آمادگیتان را بسنجید.
- پیشنیازهای واقعی کوتاهاند: متغیر و انواع پایه، ساختارهای داده، شرط/حلقه، و از همه مهمتر توابع — چون «متد» چیزی جز تابعِ داخل کلاس نیست.
- دو جملهای که تا آخر دوره همراهتاناند: متغیر برچسب است نه جعبه، و همهچیز در پایتون شیء است.
- تایپهینتها اجباری نیستند، اما اگر بلد باشید، فصلهای ۹ به بعد را بهتر میفهمید.
- Traceback را از پایین به بالا بخوانید: اول نوع خطا، بعد محل، بعد مسیر.
- مسیر دوره: نوشتن (فصلهای ۱-۶) ← خوب نوشتن (۷-۱۳) ← عمیق فهمیدن و ساختن (۱۴-۲۴).
حالا آزمون خودسنجی را بدهید. اگر نمرهتان خوب بود، آمادهاید؛ اگر نه، همان چند موردی را که در چکلیست به تردید افتادید تقویت کنید و برگردید — این کوتاهترین راه است، نه عقبماندن.
در فصل بعد: میرویم سراغ سوالی که کمتر دورهای جدیاش میگیرد: شیءگرایی اصلاً از کجا آمد و چه مشکلی را حل میکند؟ پاسخ این سوال، بقیهی دوره را از «حفظکردنِ سینتکس» به «فهمیدنِ طراحی» تبدیل میکند.