الدالة classmethod()
في بايثون
تُحوّل الدّالة classmethod()
المُزخرِفةُ (decorator) تابعًا عاديًّا إلى تابع صنف (class method).
يستقبل تابع الصّنفِ الصّنفَ كمُعاملٍ أول، تمامًا كما يستقبل التّابع العاديّ النّسخة (instance) كمُعامل أولٍ نُشير إليه بالاسم self
.
البنية العامة
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
المعاملات
لا توجد مُعاملات. لكنّ الدّالة المُزخرَفَة f
تستقبل المُعامل cls
الذي يُشير إلى الصّنف الذي عُرّف عليه التّابع.
أمثلة
المثال التّالي يوضّح كيفيّة تعريف تابع صنفٍ يُعيد اسم الصّنف عند استدعائه:
>>> class Person:
... @classmethod
... def f(cls):
... return cls.__name__ # هذه الخاصّية الخاصّة تسمح لنا بالوصول إلى اسم الصّنف
...
>>> Person.f() # استدعاء التّابع على الصّنف مباشرةً
'Person'
>>> Person().f() # استدعاء التّابع على نسخةٍ مُباشرةً
'Person'
>>> ahmed = Person() # إنشاء نُسخة من الصّنف
>>> ahmed.f() # استدعاء التّابع على النّسخة
'Person'
ملاحظات
يُمكن استدعاء تابع الصّنف سواء على الصّنف مُباشرةً (مثل C.f()
) أو على نسخة من الصّنف (مثل C().f()
). عند استدعاء التّابع على النّسخة، تُتجاهل النّسخة ويُمرَّر صنفُها إلى التّابع، إن استُدعيَ تابع صنفٍ لصنفٍ مشتقّ (derived class)، فسيُمرَّر كائن الصّنف المُشتقّ كمُعاملٍ أولٍ للتّابع.
توابع الأصناف مُختلفة عن التوابع السّاكنة () في لغات البرمجة الأخرى مثل Java وC++. إن أردت استعمال التوابع السّاكنة، فانظر صفحة الدّالة staticmethod()
.