Skip to content

Commit d842014

Browse files
author
Saeid
committed
l17: Instance Attribute
1 parent b0794b4 commit d842014

1 file changed

Lines changed: 101 additions & 8 deletions

File tree

lessons/l17.rst

Lines changed: 101 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
.
5151
<statement-N>
5252

53-
کلمه کلیدی تعریف کلاس - ``class`` - یک دستور اجراپذیر (Executable Statement) است. یک کلاس پیش از اجرای دستور خود هیچ تاثیری در برنامه ندارد. این شرایط سبب می‌شود که حتی بتوان یک کلاس را در میان بدنه دستور شرط (``if``) یا درون بدنه یک تابع تعریف کرد. [در پشت صحنه]: با اجرای دستور تعریف کلاس، یک شی از نوع type در حافظه ایجاد می‌گردد و از نام کلاس برای اشاره به آن شی استفاده می‌شود.
53+
کلمه کلیدی تعریف کلاس - ``class`` - یک دستور اجراپذیر (Executable Statement) است، همانند دستور ``def`` برای توابع. یک کلاس پیش از اجرای دستور خود هیچ تاثیری در برنامه ندارد. این شرایط سبب می‌شود که حتی بتوان یک کلاس را در میان بدنه دستور شرط (``if``) یا درون بدنه یک تابع تعریف کرد.
5454

5555
بعد از کلمه کلیدی ``class`` نام کلاس (به دلخواه کاربر) نوشته می‌شود. سطر نخست تعریف مانند تمام دستورات مرکب (Compound) که به صورت معمول در چند سطر نوشته می‌شوند و سرآیند دارند، به کاراکتر ``:`` ختم می‌شود. از سطر دوم با رعایت یکنواخت تورفتگی دستورات بدنه کلاس نوشته می‌شوند::
5656
@@ -71,9 +71,11 @@
7171
کلاس‌ها نیز همانند توابع حوزه (Scope) خود را دارند - درس دوازدهم. با تعریف هر کلاس یک حوزه محلی جدید در برنامه پایتونی تعریف می‌گردد.
7272

7373
.. tip::
74-
یک کلاس، تعریف کننده صفات (ویژگی‌ها) - که به عنوان Attribute شناخته می‌شوند - و رفتار‌های (عملیات) - که به عنوان Method شناخته می‌شوند - اشیایی است که از آن ایجاد خواهد شد. در واقع نام کلاس معرف نوع (type) اشیای خود است.
74+
یک کلاس، تعریف کننده صفات (ویژگی‌ها) - که به عنوان Attribute شناخته می‌شوند - و رفتار‌های (عملیات) - که به عنوان Method شناخته می‌شوند - اشیایی است که از آن ایجاد خواهد شد. در واقع نام کلاس معرف نوع (Type) اشیای خود است.
7575

7676

77+
به بیانی ساده‌تر، هر کلاس می‌تواند شامل تعدادی تابع و متغیر در داخل بدنه خود باشد. که به متغیرها: Attribute و به توابع: Method گفته می‌شود. هر یک از این Attributeها و Methodها انواعی دارند که در ادامه شرح داده خواهد شد.
78+
7779
نمونه‌سازی (Instantiation)
7880
--------------------------------------------------------
7981

@@ -89,24 +91,24 @@
8991
>>> type(sample_object)
9092
<class '__main__.Sample'>
9193

92-
در زبان پایتون وقتی در سمت راست عملگر انتساب نام کلاس ذکر گردد - همچون فراخوانی یک تابع - یک شی از آن کلاس ایجاد می‌گرد.
94+
در زبان برنامه‌نویسی پایتون با فراخوانی نام کلاس - همچون فراخوانی یک تابع - یک شی از آن کلاس ایجاد می‌گرد.
9395

9496
از هر کلاس می‌توان بی‌نهایت نمونه‌سازی داشت. هر شی از یک کلاس، حوزه (Scope) مخصوص به خود را دارد که جدا از دیگر اشیا آن کلاس خواهد بود. بنابراین اشیا هر کلاس کاملا مستقل و ایزوله (isolated) از یکدیگر هستند.
9597

9698

9799
سازنده (Constructor)
98100
~~~~~~~~~~~~~~~~~~~~~~~~~
99101

100-
در مبحث شی‌گرایی، هنگام ساخت یک شی (ایجاد یک نمونه جدید)، به صورت خودکار یک متد از داخل کلاس مورد نظر فراخوانی می‌شود. به این متد **سازنده (Constructor)** گفته می‌شود. فراخوانی خودکار این متد به برنامه‌نویس این امکان را می‌دهد که در صورت تمایل بتواند شی جدید از کلاس مورد نظر را در همان هنگام ساخت، شخصی‌سازی نماید.
102+
در مبحث شی‌گرایی، هنگام ساخت یک شی (ایجاد یک نمونه جدید)، به صورت خودکار یک متد از داخل کلاس مورد نظر فراخوانی می‌شود. به این متد، **سازنده (Constructor)** گفته می‌شود. فراخوانی خودکار این متد به برنامه‌نویس این امکان را می‌دهد که در صورت تمایل بتواند چگونگی ایجاد شی جدید را مدیریت یا در همان هنگام ساخت، شخصی‌سازی نماید.
101103

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>`__] باید توجه داشت که تمام این متدها یک پیاده‌سازی پیش‌فرض در پایتون دارند و الزامی برای پیاده‌سازی از طرف برنامه‌نویس وجود ندارد.
103105

104106
در فرآیند نمونه‌سازی از یک کلاس پایتون، به ترتیب دو متد خاص درگیر هستند: ``__new__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#object.__new__>`__] و ``__init__`` [`اسناد پایتون <https://docs.python.org/3/reference/datamodel.html#object.__init__>`__]
105107

106108

107-
متد ``__new__`` در زمان ایجاد شی و دقیقا برای ایجاد شی فراخوانی می‌شود، خروجی این متد یک شی جدید از آن کلاس می‌باشد. این متد از نوع Static Method است - *در بخش بعدی شرح داده خواهد شد* - بنابراین نخستین پارامتر این متد کلاس جاری است که قرار است از آن یک شی ایجاد گردد و پارامترهای دیگر که می‌توانند حاوی مقادیری باشد که در زمان نمونه‌سازی ارسال شده است.
109+
متد ``__new__`` در زمان ایجاد شی و دقیقا برای ایجاد شی فراخوانی می‌شود، خروجی این متد یک شی جدید از آن کلاس می‌باشد. این متد از نوع Class Method است - *در بخش بعدی شرح داده خواهد شد* - بنابراین نخستین پارامتر این متد کلاس جاری است که قرار است از آن یک شی ایجاد گردد و پارامترهای دیگر که می‌توانند حاوی مقادیری باشد که در زمان نمونه‌سازی ارسال شده است.
108110

109-
متد ``__init__`` بلافاصله پس از اینکه شی جدید توسط متد ``__new__`` ایجاد گردید و درست قبل از اینکه شی جدید از متد ``__new__`` بازگردانده شود (returned)، فراخوانی می‌گردد. این متد از نوع Instance Method است - *در بخش بعدی شرح داده خواهد شد* - و بنابراین نخستین پارامتر این متد شی جاری است (همان شی‌ای که توسط ``__new__`` ایجاد گردیده است) و پارامترهای دیگر که برنامه‌نویس در زمان نمونه‌سازی جهت مقدار دهی در شی ارسال می‌کند - توجه داشته باشید که این متد خروجی ندارد (بدون دستور return یا بهتر بگوییم خروجی آن None است) و شی جدید حاص خروجی متد ``__new__`` خواهد بود.
111+
متد ``__init__`` بلافاصله پس از اینکه شی جدید توسط متد ``__new__`` ایجاد گردید و درست قبل از اینکه شی جدید از متد ``__new__`` بازگردانده شود (returned)، فراخوانی می‌گردد. این متد از نوع Instance Method است - *در بخش بعدی شرح داده خواهد شد* - و بنابراین نخستین پارامتر این متد شی جاری است (همان شی‌ای که توسط ``__new__`` ایجاد گردیده است) و پارامترهای دیگر که برنامه‌نویس در زمان نمونه‌سازی جهت مقدار دهی در شی ارسال می‌کند - توجه داشته باشید که این متد خروجی ندارد (بدون دستور return یا بهتر بگوییم خروجی آن None است) و شی جدید حاصل خروجی متد ``__new__`` خواهد بود.
110112

111113
متاسفانه برخی افراد تازه وارد در زبان پایتون و همینطور برخی آموزش‌ها متد ``__init__`` را به عنوان Constructor کلاس‌های پایتون می‌دانند اما درست این است که در فرآیند نمونه‌سازی در زبان برنامه‌نویسی پایتون، دو متد ``__new__`` و ``__init__`` با یکدیگر کار می‌کنند و نقش سازنده (Constructor) را ایفا می‌کنند. متد ``__new__`` شی را ایجاد (create) و متد ``__init__`` آن را شحصی‌سازی (customize) می‌کند:
112114

@@ -163,13 +165,104 @@
163165
* همانطور که بیان شد، هر کلاس پایتون یک پیاده‌سازی پیش‌فرض از دو متد ``__new__`` و ``__init__`` دارد بنابراین الزامی به پیاده‌سازی دو متد ``__new__`` و ``__init__`` برای نمونه‌سازی از کلاس نیست. در اکثر مواقع ``__new__`` پیاده‌سازی نمی‌شود اما زمانی که می‌خواهید در زمان نمونه‌سازی مقادیری در شی تنظیم نمایید، لازم است متد ``__init__`` را پیاده‌سازی نمایید.
164166

165167
* معمولا ``__new__`` زمانی پیاده‌سازی می‌شود که بخواهیم محدودیت‌هایی در ایجاد شی کلاس مورد نظر ایجاد کنیم. برای نمونه در پیاده‌سازی طرح Singleton [`ویکی‌پدیا <https://en.wikipedia.org/wiki/Singleton_pattern>`__] یک کلاس.
168+
169+
* ارسال آرگومان در زمان نمونه‌سازی شی یا همان پیاده‌سازی متد ``__init__`` به برنامه‌نویس این اطمینان را می‌دهد که شی جدید در یک وضعیت درست تنظیم شده است.
166170

167171

168172

169173
صفات (Attributes)
170174
-----------------------------------------------------
171175

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+
173266

174267

175268

0 commit comments

Comments
 (0)