|
10 | 10 |
|
11 | 11 |
|
12 | 12 |
|
13 | | -پیشتر مفهوم شیگرایی شرح داده شده است (درس پنجم). در این درس میخواهیم به بررسی چگونگی پیادهسازی این مفهوم در زبان برنامه نویسی پایتون بپردازیم. پیشنیاز این درس مطالعه درس پنجم است. |
| 13 | +پیشتر مفهوم شیگرایی شرح داده شده است (درس پنجم). در این درس میخواهیم به بررسی چگونگی پیادهسازی این مفهوم در زبان برنامه نویسی پایتون بپردازیم. هنگام نگارش این درس فرض بر این بوده است که خوانندگان دروس پیش، بخصوص درس پنجم و دروس مربوط به توابع را مطالعه کردهاند. |
14 | 14 |
|
15 | | -توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارايه خواهد شد. |
| 15 | +این درس بر ارائه تعاریف مربوط به کلاس (Class) و شی (Object) از مفاهیم شیگرایی حاکم در زبان برنامهنویسی پایتون تمرکز دارد و مفاهیم باقی مانده در دروس آتی ارائه خواهند شد. |
| 16 | + |
| 17 | +توجه داشته باشید، هم اکنون پشتیبانی نسخه 2x پایتون به پایان رسیده است. بنابراین برخلاف دروس پیشین و به منظور جلوگیری از پیچیدگیهای غیر ضروری، تمام مطالب این درس بر مبنای پایتون 3x ارائه میشود. |
16 | 18 |
|
17 | 19 |
|
18 | 20 |
|
|
31 | 33 |
|
32 | 34 | همانطور که پیشتر نیز گفته شده است، پایتون یک زبان برنامهنویسی چند الگویی (multi-paradigm) است و از الگوهای مختلفی از جمله شی گرایی پشتیبانی میکند. شی گرایی یک الگوی برنامهنویسی یا روشی برای طراحی کدهای برنامه است. |
33 | 35 |
|
34 | | -در این شیوه کدهای برنامه در قالب موجودیتهای کوچکی به نام **کلاس (Class)** به وجود میآیند. کلاسها چیزی نیستند جز ابزاری که توسط آن میتوان دادهها و عملیات مرتبط با یکدیگر را در یک دسته و جدا از سایر بخشهای کد قرار داد. با کمک کلاسها رفتار و عملکرد هر تکه از کد مشخص است و با سایر بخشهای کد تداخل پیدا نمیکند. ایجاد یک کلاس به معنی ایجاد یک **نوع (Type)** جدید در برنامه میباشد که میتوان چندین **شی (Object)** یا **نمونه (Instance)** از آن نوع ایجاد کرد. یک برنامه شیگرا حاصل ارتباط و تعامل اشیا مختلف ایجاد شده در آن است. |
| 36 | +در این شیوه، کدهای برنامه در قالب موجودیتهای کوچکی به نام **کلاس (Class)** به وجود میآیند. کلاسها چیزی نیستند جز ابزاری که توسط آن میتوان دادهها و عملیات مرتبط با یکدیگر را در یک دسته و جدا از سایر بخشهای کد قرار داد. با کمک کلاسها رفتار و عملکرد هر تکه از کد مشخص است و با سایر بخشهای کد تداخل پیدا نمیکند. ایجاد یک کلاس به معنی ایجاد یک **نوع (Type)** جدید در برنامه میباشد که میتوان چندین **شی (Object)** یا **نمونه (Instance)** از آن نوع ایجاد کرد. یک برنامه شیگرا حاصل ارتباط و تعامل اشیا مختلف ایجاد شده در آن است. |
35 | 37 |
|
36 | | -مفاهیم زیادی از پایتون تا پیش از این درس مطرح شده است که باید بدانیم که تمام آنها از پیادهسازی شی گرا پیروی میکردند. هر چیزی در پایتون یک شی است. انواع داده مانند اعداد، رشته، لیست یا دیکشنری همگی شی بودند - نمونههایی که از کلاسهای مربوط به خود ایجاد شدهاند. حتی تعریف تابع نیز به معنی ایجاد یک شی از کلاس متناطر آن بوده است. اما حالا میخواهیم نوع یا کلاسهای مورد نظر خودمان را در برنامه ایجاد و اشیایی از این کلاسها نمونه سازی کنیم. در ادامه به شرح این روند خواهیم پرداخت. |
| 38 | +مفاهیم زیادی از پایتون تا پیش از این درس مطرح شده است، باید بدانیم که تمام آنها از پیادهسازی شی گرا پیروی میکردند. هر چیزی در پایتون یک شی است. انواع داده مانند اعداد، رشته، لیست یا دیکشنری همگی شی بودند - نمونههایی که از کلاسهای مربوط به خود ایجاد شدهاند. حتی تعریف تابع نیز به معنی ایجاد یک شی از کلاس متناطر آن بوده است. اما حالا میخواهیم نوع یا کلاسهای مورد نظر خودمان را در برنامه ایجاد و اشیایی از این کلاسها نمونه سازی کنیم. در ادامه به شرح این روند خواهیم پرداخت. |
37 | 39 |
|
38 | 40 |
|
39 | 41 | تعریف کلاس (Class) |
|
163 | 165 | * معمولا ``__new__`` زمانی پیادهسازی میشود که بخواهیم محدودیتهایی در ایجاد شی کلاس مورد نظر ایجاد کنیم. برای نمونه در پیادهسازی طرح Singleton [`ویکیپدیا <https://en.wikipedia.org/wiki/Singleton_pattern>`__] یک کلاس. |
164 | 166 |
|
165 | 167 |
|
| 168 | + |
| 169 | +صفات (Attributes) |
| 170 | +----------------------------------------------------- |
| 171 | + |
| 172 | +صفات یا ویژگیها که در شی گرایی |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | + |
166 | 177 | متد (Method) |
167 | 178 | ----------------------------------------------------- |
168 | 179 |
|
|
193 | 204 | متد شی (Instance Method) |
194 | 205 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
195 | 206 |
|
196 | | -رایجترین نوع متد در پایتون است. برای ایجاد این متد نیازی به دکوراتور (Decorator - درس سیزدهم) نیست. همانطور که از نام این متد مشخص است این متد تنها از سوی اشیا یک کلاس قابل استفاده است. هر شی از کلاس صفات (Attributes - *کمی جلوتر شرح داده خواهد شد*) خاص خود را دارد که از این متدها میتوان برای دستیابی، دستکاری و مدیریت آنها استفاده کرد. |
| 207 | +رایجترین نوع متد در پایتون است. برای ایجاد این متد نیازی به دکوراتور (Decorator - درس سیزدهم) نیست. همانطور که از نام این متد مشخص است این متد تنها از سوی اشیا یک کلاس قابل استفاده است. هر شی از کلاس صفات (Attributes - *کمی جلوتر شرح داده خواهد شد*) خاص خود را دارد که از این متدها میتوان برای دستیابی، دستکاری آنها استفاده کرد. |
197 | 208 |
|
| 209 | +این نوع متد همواره میبایست حداقل یک پارامتر داشته باشد. پارامتر نخست که معمولا ``self`` نامگذاری میشود حاوی شی جاری از کلاس است - در واقع همان شی ای که این متد را فراخوانی کرده است. این مقدار همواره از سوی مفسر پایتون ارسال میگردد و نیازی به ارسال از سوی برنامهنویس ندارد: |
| 210 | + |
| 211 | +.. code-block:: python |
| 212 | + :linenos: |
| 213 | +
|
| 214 | + class Sample(): |
| 215 | + |
| 216 | + def __init__(self, char='*'): |
| 217 | + self.character = char |
| 218 | + |
| 219 | + def multiply_print(self, count=1): |
| 220 | + print(self.character * count) |
| 221 | + |
| 222 | + |
| 223 | + sample_1 = Sample() # Instantiating a new Object |
| 224 | +
|
| 225 | + sample_1.multiply_print() |
| 226 | + sample_1.multiply_print(10) |
| 227 | +
|
| 228 | + print('-' * 30) |
| 229 | +
|
| 230 | + sample_2 = Sample('#') # Instantiating a new Object |
| 231 | +
|
| 232 | + sample_2.multiply_print() |
| 233 | + sample_2.multiply_print(10) |
| 234 | +
|
| 235 | +:: |
| 236 | + |
| 237 | + * |
| 238 | + ********** |
| 239 | + ------------------------------ |
| 240 | + # |
| 241 | + ########## |
| 242 | + |
| 243 | + |
| 244 | +گفته شده که متد ``__init__`` جزیی از مفهوم Constructor کلاسهای پایتون بوده و برای شخصیسازی یک شی در زمان ایجاد آن به کار میرود - کاربرد معمول: افزودن Attribute (*که در بخشهای آتی شرح داده میشود*) به شی است. در نمونه کد بالا، این متد یک پارامتر char دریافت میکند - این پارامتر مقدار پیشفرض ``*`` را دارد، بنابراین ارسال آرگومان متناظر برای آن اجباری نیست (تابع در پایتون - درس دوازدهم). با این کار میتوانیم در زمان نمونهسازی شی، یک Attribute با نام character در آن تعریف نماییم (سطر ۴). ما میخواهیم مقدار Attribute یا صفت character از هر شی را به تعداد دلخواه چاپ نماییم، از آنجا که این مقدار یک صفتِ متعلق به شی است و در ازای هر شی این مقدار میتواند متفاوت باشد پس ما برای این کار میبایست که یک Instance Method در بدنه کلاس تعریف کنیم (متد ``multiply_print`` ) - چرا که تنها در این صورت است که میتوانیم به ``self`` دسترسی داشته باشیم و مقدار صفت character را از آن دستیابی کنیم. |
| 245 | + |
| 246 | +.. tip:: |
| 247 | + |
| 248 | + Instance Methodها تنها میتوانند توسط اشیا فراخوانی شوند. روند فراخوانی یک متد توسط شی نیز به صورت نام شی + کاراکتر ``.`` + نام متد میباشد. |
198 | 249 |
|
199 | 250 |
|
200 | 251 |
|
|
207 | 258 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
208 | 259 |
|
209 | 260 |
|
| 261 | + |
| 262 | + |
210 | 263 | متدهای جادویی (Magic methods) |
211 | 264 | ----------------------------------------------------- |
212 | 265 |
|
213 | 266 |
|
214 | 267 |
|
215 | | -صفات (Attributes) |
216 | | ------------------------------------------------------ |
| 268 | +هر چیزی در پایتون یک شی است |
| 269 | +--------------------------------------------------------------------------------------- |
217 | 270 |
|
218 | | -صفات یا ویژگیها که در شی گرایی |
219 | 271 |
|
220 | 272 |
|
221 | 273 | | |
|
0 commit comments