|
50 | 50 | . |
51 | 51 | <statement-N> |
52 | 52 |
|
53 | | -کلمه کلیدی تعریف کلاس - ``class`` - یک دستور اجراپذیر (Executable Statement) است. یک کلاس پیش از اجرای دستور خود هیچ تاثیری در برنامه ندارد. این شرایط سبب میشود که حتی بتوان یک کلاس را در میان بدنه دستور شرط (``if``) یا درون بدنه یک تابع تعریف کرد. [در پشت صحنه]: با اجرای دستور تعریف کلاس، یک شی از نوع type در حافظه ایجاد میگردد و از نام کلاس برای اشاره به آن شی استفاده میشود. |
| 53 | +کلمه کلیدی تعریف کلاس - ``class`` - یک دستور اجراپذیر (Executable Statement) است، همانند دستور ``def`` برای توابع. یک کلاس پیش از اجرای دستور خود هیچ تاثیری در برنامه ندارد. این شرایط سبب میشود که حتی بتوان یک کلاس را در میان بدنه دستور شرط (``if``) یا درون بدنه یک تابع تعریف کرد. |
54 | 54 |
|
55 | 55 | بعد از کلمه کلیدی ``class`` نام کلاس (به دلخواه کاربر) نوشته میشود. سطر نخست تعریف مانند تمام دستورات مرکب (Compound) که به صورت معمول در چند سطر نوشته میشوند و سرآیند دارند، به کاراکتر ``:`` ختم میشود. از سطر دوم با رعایت یکنواخت تورفتگی دستورات بدنه کلاس نوشته میشوند:: |
56 | 56 | |
|
71 | 71 | کلاسها نیز همانند توابع حوزه (Scope) خود را دارند - درس دوازدهم. با تعریف هر کلاس یک حوزه محلی جدید در برنامه پایتونی تعریف میگردد. |
72 | 72 |
|
73 | 73 | .. tip:: |
74 | | - یک کلاس، تعریف کننده صفات (ویژگیها) - که به عنوان Attribute شناخته میشوند - و رفتارهای (عملیات) - که به عنوان Method شناخته میشوند - اشیایی است که از آن ایجاد خواهد شد. در واقع نام کلاس معرف نوع (type) اشیای خود است. |
| 74 | + یک کلاس، تعریف کننده صفات (ویژگیها) - که به عنوان Attribute شناخته میشوند - و رفتارهای (عملیات) - که به عنوان Method شناخته میشوند - اشیایی است که از آن ایجاد خواهد شد. در واقع نام کلاس معرف نوع (Type) اشیای خود است. |
75 | 75 |
|
76 | 76 |
|
| 77 | + به بیانی سادهتر، هر کلاس میتواند شامل تعدادی تابع و متغیر در داخل بدنه خود باشد. که به متغیرها: Attribute و به توابع: Method گفته میشود. هر یک از این Attributeها و Methodها انواعی دارند که در ادامه شرح داده خواهد شد. |
| 78 | + |
77 | 79 | نمونهسازی (Instantiation) |
78 | 80 | -------------------------------------------------------- |
79 | 81 |
|
|
89 | 91 | >>> type(sample_object) |
90 | 92 | <class '__main__.Sample'> |
91 | 93 |
|
92 | | -در زبان پایتون وقتی در سمت راست عملگر انتساب نام کلاس ذکر گردد - همچون فراخوانی یک تابع - یک شی از آن کلاس ایجاد میگرد. |
| 94 | +در زبان برنامهنویسی پایتون با فراخوانی نام کلاس - همچون فراخوانی یک تابع - یک شی از آن کلاس ایجاد میگرد. |
93 | 95 |
|
94 | 96 | از هر کلاس میتوان بینهایت نمونهسازی داشت. هر شی از یک کلاس، حوزه (Scope) مخصوص به خود را دارد که جدا از دیگر اشیا آن کلاس خواهد بود. بنابراین اشیا هر کلاس کاملا مستقل و ایزوله (isolated) از یکدیگر هستند. |
95 | 97 |
|
96 | 98 |
|
97 | 99 | سازنده (Constructor) |
98 | 100 | ~~~~~~~~~~~~~~~~~~~~~~~~~ |
99 | 101 |
|
100 | | -در مبحث شیگرایی، هنگام ساخت یک شی (ایجاد یک نمونه جدید)، به صورت خودکار یک متد از داخل کلاس مورد نظر فراخوانی میشود. به این متد **سازنده (Constructor)** گفته میشود. فراخوانی خودکار این متد به برنامهنویس این امکان را میدهد که در صورت تمایل بتواند شی جدید از کلاس مورد نظر را در همان هنگام ساخت، شخصیسازی نماید. |
| 102 | +در مبحث شیگرایی، هنگام ساخت یک شی (ایجاد یک نمونه جدید)، به صورت خودکار یک متد از داخل کلاس مورد نظر فراخوانی میشود. به این متد، **سازنده (Constructor)** گفته میشود. فراخوانی خودکار این متد به برنامهنویس این امکان را میدهد که در صورت تمایل بتواند چگونگی ایجاد شی جدید را مدیریت یا در همان هنگام ساخت، شخصیسازی نماید. |
101 | 103 |
|
102 | | -از طرفی هر کلاس در زبان برنامهنویسی پایتون شامل یک سری متد خاص میباشد که نام تمام آنها با دو کاراکتر خطزیرین (Underscore or Underline ``_``) شروع و نیز پایان مییابد همانند: ``__init__`` - در کامیونیتی پایتون به دو کاراکتر خطزیرین در کنار هم به اصطلاح **Dunder** (Double underscores) گفته میشود - به این متدهای خاص در پایتون به اصطلاح Special Methods ،Dunder Methods یا Magic Methods گفته میشود. [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#basic-customization>`__] باید توجه داشت که تمام این متدها یک پیادهسازی پیشفرض در پایتون دارند و الزامی به پیادهسازی از سوی پایتون برای برنامهنویس نمیباشد. |
| 104 | +از طرفی هر کلاس در زبان برنامهنویسی پایتون شامل یک سری متد خاص میباشد که نام تمام آنها با دو کاراکتر خطزیرین (Underscore or Underline ``_``) شروع و نیز پایان مییابد همانند: ``__init__`` - در کامیونیتی پایتون به دو کاراکتر خطزیرین در کنار هم به اصطلاح **Dunder** (Double underscores) گفته میشود - به این متدهای خاص در پایتون به اصطلاح Special Methods ،Dunder Methods یا Magic Methods گفته میشود. [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#basic-customization>`__] باید توجه داشت که تمام این متدها یک پیادهسازی پیشفرض در پایتون دارند و الزامی برای پیادهسازی از طرف برنامهنویس وجود ندارد. |
103 | 105 |
|
104 | 106 | در فرآیند نمونهسازی از یک کلاس پایتون، به ترتیب دو متد خاص درگیر هستند: ``__new__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#object.__new__>`__] و ``__init__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#object.__init__>`__] |
105 | 107 |
|
106 | 108 |
|
107 | | -متد ``__new__`` در زمان ایجاد شی و دقیقا برای ایجاد شی فراخوانی میشود، خروجی این متد یک شی جدید از آن کلاس میباشد. این متد از نوع Static Method است - *در بخش بعدی شرح داده خواهد شد* - بنابراین نخستین پارامتر این متد کلاس جاری است که قرار است از آن یک شی ایجاد گردد و پارامترهای دیگر که میتوانند حاوی مقادیری باشد که در زمان نمونهسازی ارسال شده است. |
| 109 | +متد ``__new__`` در زمان ایجاد شی و دقیقا برای ایجاد شی فراخوانی میشود، خروجی این متد یک شی جدید از آن کلاس میباشد. این متد از نوع Class Method است - *در بخش بعدی شرح داده خواهد شد* - بنابراین نخستین پارامتر این متد کلاس جاری است که قرار است از آن یک شی ایجاد گردد و پارامترهای دیگر که میتوانند حاوی مقادیری باشد که در زمان نمونهسازی ارسال شده است. |
108 | 110 |
|
109 | | -متد ``__init__`` بلافاصله پس از اینکه شی جدید توسط متد ``__new__`` ایجاد گردید و درست قبل از اینکه شی جدید از متد ``__new__`` بازگردانده شود (returned)، فراخوانی میگردد. این متد از نوع Instance Method است - *در بخش بعدی شرح داده خواهد شد* - و بنابراین نخستین پارامتر این متد شی جاری است (همان شیای که توسط ``__new__`` ایجاد گردیده است) و پارامترهای دیگر که برنامهنویس در زمان نمونهسازی جهت مقدار دهی در شی ارسال میکند - توجه داشته باشید که این متد خروجی ندارد (بدون دستور return یا بهتر بگوییم خروجی آن None است) و شی جدید حاص خروجی متد ``__new__`` خواهد بود. |
| 111 | +متد ``__init__`` بلافاصله پس از اینکه شی جدید توسط متد ``__new__`` ایجاد گردید و درست قبل از اینکه شی جدید از متد ``__new__`` بازگردانده شود (returned)، فراخوانی میگردد. این متد از نوع Instance Method است - *در بخش بعدی شرح داده خواهد شد* - و بنابراین نخستین پارامتر این متد شی جاری است (همان شیای که توسط ``__new__`` ایجاد گردیده است) و پارامترهای دیگر که برنامهنویس در زمان نمونهسازی جهت مقدار دهی در شی ارسال میکند - توجه داشته باشید که این متد خروجی ندارد (بدون دستور return یا بهتر بگوییم خروجی آن None است) و شی جدید حاصل خروجی متد ``__new__`` خواهد بود. |
110 | 112 |
|
111 | 113 | متاسفانه برخی افراد تازه وارد در زبان پایتون و همینطور برخی آموزشها متد ``__init__`` را به عنوان Constructor کلاسهای پایتون میدانند اما درست این است که در فرآیند نمونهسازی در زبان برنامهنویسی پایتون، دو متد ``__new__`` و ``__init__`` با یکدیگر کار میکنند و نقش سازنده (Constructor) را ایفا میکنند. متد ``__new__`` شی را ایجاد (create) و متد ``__init__`` آن را شحصیسازی (customize) میکند: |
112 | 114 |
|
|
163 | 165 | * همانطور که بیان شد، هر کلاس پایتون یک پیادهسازی پیشفرض از دو متد ``__new__`` و ``__init__`` دارد بنابراین الزامی به پیادهسازی دو متد ``__new__`` و ``__init__`` برای نمونهسازی از کلاس نیست. در اکثر مواقع ``__new__`` پیادهسازی نمیشود اما زمانی که میخواهید در زمان نمونهسازی مقادیری در شی تنظیم نمایید، لازم است متد ``__init__`` را پیادهسازی نمایید. |
164 | 166 |
|
165 | 167 | * معمولا ``__new__`` زمانی پیادهسازی میشود که بخواهیم محدودیتهایی در ایجاد شی کلاس مورد نظر ایجاد کنیم. برای نمونه در پیادهسازی طرح Singleton [`ویکیپدیا <https://en.wikipedia.org/wiki/Singleton_pattern>`__] یک کلاس. |
| 168 | + |
| 169 | + * ارسال آرگومان در زمان نمونهسازی شی یا همان پیادهسازی متد ``__init__`` به برنامهنویس این اطمینان را میدهد که شی جدید در یک وضعیت درست تنظیم شده است. |
166 | 170 |
|
167 | 171 |
|
168 | 172 |
|
169 | 173 | صفات (Attributes) |
170 | 174 | ----------------------------------------------------- |
171 | 175 |
|
172 | | -صفات یا ویژگیها که در شی گرایی |
| 176 | +به بیانی ساده، متغیرهایی که به یک کلاس یا یک شی انتساب داده میشود صفت یا ویژگی یا Attribute خوانده میشوند. در بحث شی گرایی زبان برنامهنویسی پایتون دو نوع Attribute وجود دارد: |
| 177 | + |
| 178 | +* Instance Attribute |
| 179 | +* Class Attribute |
| 180 | + |
| 181 | + |
| 182 | + |
| 183 | + |
| 184 | +Instance Attribute |
| 185 | +~~~~~~~~~~~~~~~~~~~~~ |
| 186 | + |
| 187 | +به Attributeهای خاص یک شی گفته میشود. به هر شی در زبان برنامهنویسی پایتون میتوان با استفاده از سینتکس زیر یک Attribute انتساب داد:: |
| 188 | + |
| 189 | + object.attribute_name = value |
| 190 | + |
| 191 | + |
| 192 | +.. code-block:: python |
| 193 | + :linenos: |
| 194 | + |
| 195 | + class Sample(): pass |
| 196 | + |
| 197 | + sample = Sample() |
| 198 | +
|
| 199 | + sample.a_new_attribute = 'A New Attribute!' |
| 200 | +
|
| 201 | + print(sample.a_new_attribute) |
| 202 | +
|
| 203 | +:: |
| 204 | + |
| 205 | + A New Attribute! |
| 206 | + |
| 207 | +هر چیزی در پایتون یک شی است ولی ممکن است مفسر پایتون برای برخی اشیا محدودیتهایی در نظر گرفته باشد و شما نتوانید به هر شیای در پایتون Attribute اضافه نمایید. در این لحظه جا دارد اشاره شود به درس چهاردهم (بخش Function Attributes) که در واقع از این قانون اشیا در پایتون پیروی میکند. |
| 208 | + |
| 209 | +.. tip:: |
| 210 | + مقدار این دسته از Attributeها به ازای هر شی منحصربهفرد است. برای نمونه صفتهایی همچون نام، نامخانوادگی، سن و جنسیت برای هر یک از اشیای کلاس «شخص» قابل تعریف است. بدیهی است که هر نمونه شی از این کلاس میبایست شامل مقادیر منحصربهفردی از این Attributeها باشد. |
| 211 | + |
| 212 | +برگردیم به مثال قبل که در آن ما یک کلاس به اسم Sample ایجاد (سطر ۱) و به یک شی از آن - پس از نمونهسازی (سطر ۳) - یک Attribute به نام a_new_attribute اضافه کردیم (سطر ۵). این شیوه افزودن Attribute به اشیای کلاسهایی که خودمان آنها را تعریف میکنیم چندان جالب نیست و ممکن است باعث بروز خطاهایی منطقی در برنامه گردد، بهتر است این کار توسط متد ``__init__`` که در واقع initializer اشیا پایتون است، انجام پذیرد - به نمونه کدهای زیر توجه نمایید: |
| 213 | + |
| 214 | + |
| 215 | +.. code-block:: python |
| 216 | + :linenos: |
| 217 | + |
| 218 | + class Sample(): |
| 219 | + |
| 220 | + def __init__(self, attribute_value): |
| 221 | + self.a_new_attribute = attribute_value |
| 222 | + |
| 223 | + sample = Sample() |
| 224 | +
|
| 225 | + print(sample.a_new_attribute) |
| 226 | +
|
| 227 | +:: |
| 228 | + |
| 229 | + A New Attribute! |
| 230 | + |
| 231 | + |
| 232 | +.. code-block:: python |
| 233 | + :linenos: |
| 234 | +
|
| 235 | + class Person(): |
| 236 | +
|
| 237 | + def __init__(self, first_name, last_name, age, gender): |
| 238 | + self.first_name = first_name |
| 239 | + self.last_name = last_name |
| 240 | + self.age = age |
| 241 | + self.gender = gender |
| 242 | + |
| 243 | + person_1 = Person('Kaneki', 'Ken', 18, 'male') |
| 244 | + person_2 = Person('Haise', 'Sasaki', 19, 'male') |
| 245 | + |
| 246 | + print(person_1.first_name) |
| 247 | + print(person_2.last_name) |
| 248 | +
|
| 249 | +
|
| 250 | +:: |
| 251 | + |
| 252 | + Kaneki |
| 253 | + Sasaki |
| 254 | + |
| 255 | + |
| 256 | +در ادامه شرح داده خواهد شد که پارامتر ``self`` به شی جاری اشاره دارد و به صورت خودکار توسط مفسر پایتون مقداردهی میشود. |
| 257 | + |
| 258 | + |
| 259 | + |
| 260 | + |
| 261 | +Class Attribute |
| 262 | +~~~~~~~~~~~~~~~~~~~~~ |
| 263 | + |
| 264 | + |
| 265 | + |
173 | 266 |
|
174 | 267 |
|
175 | 268 |
|
|
0 commit comments