Skip to content

Commit fe90b82

Browse files
author
Saeid Darvish
committed
l17: Class Method & Static Method
1 parent 607202f commit fe90b82

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

lessons/l17.rst

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,17 @@ Class Attribute
339339
متدها در واقع توابعی هستند که داخل هر کلاس تعریف می‌شوند. هر کلاس پایتون می‌تواند شامل سه نوع متد باشد:
340340

341341
* Instance Method
342+
343+
هر زمان در پیاده‌سازی یک کلاس، به شی جاری از کلاس یا Instance Attributeها نیاز داشتیم می‌بایست این نوع متد را پیاده‌سازی کنیم.
344+
342345
* Class Method
346+
347+
هر زمان در پیاده‌سازی یک کلاس، به خود کلاس یا Class Attributeها نیاز داشتیم می‌بایست این نوع متد را پیاده‌سازی کنیم.
348+
343349
* Static Method
344350

351+
هر زمان در پیاده‌سازی یک کلاس، به کلاس و به اشیای آن کلاس نیازی نداشتیم، می‌بایست این نوع متد را پیاده‌سازی کنیم. س
352+
345353
.. code-block:: python
346354
:linenos:
347355
@@ -411,11 +419,80 @@ Class Attribute
411419
متد کلاس (Class Method)
412420
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
413421

422+
این نوع متد همواره می‌بایست حداقل یک پارامتر داشته باشد. پارامتر نخست که معمولا ``cls`` نام‌گذاری می‌شود حاوی کلاس جاری است - در واقع این متد هیچ اطلاعاتی از اشیا کلاس ندارد و تنها کلاس را می‌شناسد و Class Attributeها را دستیابی و دستکاری می‌کند. مقدار ``cls`` نیز همانند ``self`` همواره از سوی مفسر پایتون ارسال می‌گردد و نیازی به ارسال از سوی برنامه‌نویس ندارد. این متد با استفاده از دکوراتور (Decorator‌ - درس سیزدهم) ``classmethod@`` ایجاد می‌شود [`اسناد پایتون <https://docs.python.org/3/library/functions.html#classmethod>`__]:
423+
424+
.. code-block:: python
425+
:linenos:
426+
427+
class Student:
428+
school_name = 'My School'
429+
430+
def __init__(self, name, family):
431+
self.name = name
432+
self.family = family
433+
434+
@classmethod
435+
def school_info(cls):
436+
print(cls)
437+
return f'name: {cls.school_name}'
438+
439+
print(Student.school_info())
440+
print('-' * 30)
441+
print(Student('My Name', 'My Family').school_info())
442+
443+
::
444+
445+
<class '__main__.Student'>
446+
name: My School
447+
------------------------------
448+
<class '__main__.Student'>
449+
name: My School
450+
451+
452+
.. tip::
453+
454+
این نوع متد (Class Method) را می‌توان هم با استفاده از نام کلاس دستیابی کرد (سطر ۱۳) و هم با استفاده از اشیای آن کلاس (سطر ۱۵)، در واقع دکوراتور ``classmethod@`` کارهای لازم برای نادیده گرفتن شی و ارسال مقدار پارامتر ``cls`` را انجام می‌دهد.
414455

415456

416457
متد ایستا (Static Method)
417458
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
418459

460+
این نوع متد با استفاده از دکوراتور (Decorator‌ - درس سیزدهم) ``staticmethod@`` ایجاد می‌شود [`اسناد پایتون <https://docs.python.org/3/library/functions.html#staticmethod>`__]. این نوع متد پایتون، نه از اشیا اطلاعاتی دارد و نه حتی از کلاس. در واقع به این نوع متد، نه مقدار ``self`` ارسال می‌شود و نه ``cls``:
461+
462+
463+
.. code-block:: python
464+
:linenos:
465+
466+
class Student:
467+
school_name = 'My School'
468+
469+
def __init__(self, name, family):
470+
self.name = name
471+
self.family = family
472+
473+
@classmethod
474+
def school_info(cls):
475+
print(cls)
476+
return f'name: {cls.school_name}'
477+
478+
@staticmethod
479+
def info():
480+
return "This is a student class"
481+
482+
print(Student.info())
483+
print('-' * 30)
484+
print(Student('My Name', 'My Family').info())
485+
486+
::
487+
488+
This is a student class
489+
------------------------------
490+
This is a student class
491+
492+
493+
.. tip::
494+
495+
این نوع متد (Static Method) را می‌توان هم با استفاده از نام کلاس دستیابی کرد (سطر ۱۷) و هم با استفاده از اشیای آن کلاس (سطر ۱۹)، در واقع دکوراتور ``staticmethod@`` کارهای لازم برای نادیده گرفتن شی و کلاس مربوط را انجام می‌دهد.
419496

420497

421498

0 commit comments

Comments
 (0)