الدالة classmethod()‎ في بايثون

من موسوعة حسوب
مراجعة 14:29، 29 مايو 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - 'Python/defining-functions' ب'Python/defining_functions')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدّالة classmethod()‎ مُزخرفٌ يُحوّل تابعًا عاديًّا في صنف ما إلى تابع صنف (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().

انظر أيضًا

مصادر