Skip to content

Commit 607202f

Browse files
author
Saeid Darvish
committed
l17: Class Attributes
1 parent d842014 commit 607202f

1 file changed

Lines changed: 68 additions & 2 deletions

File tree

lessons/l17.rst

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,75 @@ Instance Attribute
261261
Class Attribute
262262
~~~~~~~~~~~~~~~~~~~~~
263263

264+
به Attributeهای خاص یک کلاس گفته می‌شود و در واقع متغیرهایی است که درون کلاس و خارج از متدها تعریف می‌گردند. کاربرد این Attributeها به اشتراک گذاشتن یک یا چند مقدار یکسان در بین تمام اشیاست.
264265

266+
تمام اشیای یک کلاس به Class Attributeهای آن کلاس دسترسی دارند:
265267

266268

269+
.. code-block:: python
270+
:linenos:
271+
272+
class Sample():
273+
class_attribute = 0
274+
275+
print('#' * 10, 'STEP#A')
276+
print('LINE 05:', Sample.class_attribute)
277+
278+
# Instantiation
279+
sample_1 = Sample()
280+
sample_2 = Sample()
281+
282+
print('#' * 10, 'STEP#B')
283+
print('LINE 12:', sample_1.class_attribute)
284+
print('LINE 13:', sample_2.class_attribute)
285+
286+
print('#' * 10, 'STEP#C')
287+
288+
# Change class_attribute for all objects
289+
Sample.class_attribute = 1
290+
291+
print('LINE 20:', sample_1.class_attribute) # Changed!
292+
print('LINE 21:', sample_2.class_attribute) # Changed!
293+
294+
print('#' * 10, 'STEP#D')
295+
296+
# WARNING!!! Create a new instance attribute
297+
sample_2.class_attribute = 2
298+
299+
print('LINE 28:', sample_1.class_attribute)
300+
print('LINE 29:', sample_2.class_attribute) # instance attribute!!!
301+
302+
303+
::
304+
305+
########## STEP#A
306+
LINE 05: 0
307+
########## STEP#B
308+
LINE 12: 0
309+
LINE 13: 0
310+
########## STEP#C
311+
LINE 20: 1
312+
LINE 21: 1
313+
########## STEP#D
314+
LINE 28: 1
315+
LINE 29: 2
316+
317+
318+
319+
320+
.. tip::
321+
322+
مقدار Class Attributeها هم با استفاده از نام کلاس قابل دستیابی است (سطر ۵) و هم با استفاده از هر یک از اشیا آن کلاس (سطرهای ۱۲ و ۱۳).
323+
324+
.. tip::
325+
برای تغییر مقدار Class Attribute در داخل کلاس از Class Method - *در ادامه شرح داده می‌شود* - استفاده می‌شود و در بیرون کلاس **با استفاده از نام کلاس** به صورت زیر (سطر ۱۸)::
326+
327+
ClassName.class_attribute = new_value
328+
329+
.. tip::
330+
331+
برای تغییر مقدار Class Attributeها، **از شی استفاده نکنید**، با این کار تنها یک Instance Attribute برای آن شی ایجاد می‌گردد (سطر ۲۶).
332+
267333

268334

269335

@@ -297,7 +363,7 @@ Class Attribute
297363
متد شی (Instance Method)
298364
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
299365

300-
رایج‌ترین نوع متد در پایتون است. برای ایجاد این متد نیازی به دکوراتور (Decorator‌ - درس سیزدهم) نیست. همانطور که از نام این متد مشخص است این متد تنها از سوی اشیا یک کلاس قابل استفاده است. هر شی از کلاس صفات (Attributes - *کمی جلوتر شرح داده خواهد شد*) خاص خود را دارد که از این متدها می‌توان برای دستیابی، دستکاری آن‌ها استفاده کرد.
366+
رایج‌ترین نوع متد در پایتون است. برای ایجاد این متد نیازی به دکوراتور (Decorator‌ - درس سیزدهم) نیست. همانطور که از نام این متد مشخص است این متد تنها از سوی اشیا یک کلاس قابل استفاده است. همانطور که پیش‌تر صحبت شد، هر شی از کلاس صفات خاص خود را دارد (Instance Attributes) که از این متدها می‌توان برای دستیابی و دستکاری آن‌ها استفاده کرد.
301367

302368
این نوع متد همواره می‌بایست حداقل یک پارامتر داشته باشد. پارامتر نخست که معمولا ``self`` نام‌گذاری می‌شود حاوی شی جاری از کلاس است - در واقع همان شی ای که این متد را فراخوانی کرده است. این مقدار همواره از سوی مفسر پایتون ارسال می‌گردد و نیازی به ارسال از سوی برنامه‌نویس ندارد:
303369

@@ -334,7 +400,7 @@ Class Attribute
334400
##########
335401

336402

337-
گفته شده که متد ``__init__`` جزیی از مفهوم Constructor کلاس‌های پایتون بوده و برای شخصی‌سازی یک شی در زمان ایجاد آن به کار می‌رود - کاربرد معمول: افزودن Attribute (*که در بخش‌های آتی شرح داده می‌شود*) به شی است. در نمونه کد بالا، این متد یک پارامتر char دریافت می‌کند - این پارامتر مقدار پیش‌فرض ``*`` را دارد، بنابراین ارسال آرگومان متناظر برای آن اجباری نیست (تابع در پایتون - درس دوازدهم). با این کار می‌توانیم در زمان نمونه‌سازی شی، یک Attribute با نام character در آن تعریف نماییم (سطر ۴). ما می‌خواهیم مقدار Attribute یا صفت character از هر شی را به تعداد دلخواه چاپ نماییم، از آنجا که این مقدار یک صفتِ متعلق به شی است و در ازای هر شی این مقدار می‌تواند متفاوت باشد پس ما برای این کار می‌بایست که یک Instance Method در بدنه کلاس تعریف کنیم (متد ``multiply_print`` ) - چرا که تنها در این صورت است که می‌توانیم به ``self`` دسترسی داشته باشیم و مقدار صفت character را از آن دستیابی کنیم.
403+
گفته شده که متد ``__init__`` جزیی از مفهوم Constructor کلاس‌های پایتون بوده و برای شخصی‌سازی یک شی در زمان ایجاد آن به کار می‌رود و کاربرد معمول آن افزودن Attribute به شی است. در نمونه کد بالا، این متد یک پارامتر char دریافت می‌کند - این پارامتر مقدار پیش‌فرض ``*`` را دارد، بنابراین ارسال آرگومان متناظر برای آن اجباری نیست (تابع در پایتون - درس دوازدهم). با این کار می‌توانیم در زمان نمونه‌سازی شی، یک Attribute با نام character در آن تعریف نماییم (سطر ۴). ما می‌خواهیم مقدار Attribute یا صفت character از هر شی را به تعداد دلخواه چاپ نماییم، از آنجا که این مقدار یک صفتِ متعلق به شی است و در ازای هر شی این مقدار می‌تواند متفاوت باشد پس ما برای این کار می‌بایست که یک Instance Method در بدنه کلاس تعریف کنیم (متد ``multiply_print`` ) - چرا که تنها در این صورت است که می‌توانیم به ``self`` دسترسی داشته باشیم و مقدار صفت character را از آن دستیابی کنیم.
338404

339405
.. tip::
340406

0 commit comments

Comments
 (0)