0Pricing
Python Academy · درس

@classmethod و@staticmethod

عرّف الطرق الخاصة بمستوى الفئة والطرق الساكنة باستخدام المزخرفات المناسبة

@classmethod و@staticmethod درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

يستقبل ‎@classmethod‎ الفئة باعتبارها الوسيط الأول. أما ‎@staticmethod‎ فلا يستقبل شيئًا خاصًا. ويُعرَّف كلاهما داخل الفئة.

الكائن مقابل الفئة مقابل الثابت

تحصل الأساليب العادية على ‎self‎. وتحصل أساليب الفئة على ‎cls‎. ولا تحصل الأساليب الساكنة على أيٍّ منهما. اختر النوع بناءً على البيانات التي تحتاج إليها.
class Demo:
    def instance(self): return 'instance'
    @classmethod
    def class_m(cls): return f'class: {cls.__name__}'
    @staticmethod
    def static_m(): return 'static'
d = Demo()
print(d.instance())
print(Demo.class_m())
print(Demo.static_m())

‎@classmethod‎ كمصنع

الاستخدام الأكثر شيوعًا هو المُنشئات البديلة. مثلًا: ‎Date.from_string('2024-01-15')‎ بدلًا من التحليل داخل ‎__init__‎.
class Date:
    def __init__(self, y,m,d): self.y,self.m,self.d=y,m,d
    @classmethod
    def today(cls):
        from datetime import date
        d = date.today()
        return cls(d.year, d.month, d.day)
    def __repr__(self): return f'{self.y}-{self.m}-{self.d}'
print(Date.today())

‎@classmethod‎ مع الوراثة

يشير ‎cls‎ في أسلوب الفئة إلى الفئة الفرعية الفعلية، لا إلى الفئة الأساسية. وهذا يجعل أساليب المصنع تعمل بصورة صحيحة مع الفئات الفرعية.
class Animal:
    @classmethod
    def create(cls, name):
        return cls(name)
    def __init__(self, name): self.name = name
class Dog(Animal): pass
d = Dog.create('Rex')
print(type(d).__name__, d.name)

‎@staticmethod‎ للأدوات المساعدة

الأساليب الساكنة دوال عادية جُمعت منطقيًا مع فئة. ولا يمكنها الوصول إلى بيانات الفئة أو الكائن.
class MathHelper:
    @staticmethod
    def clamp(value, lo, hi):
        return max(lo, min(hi, value))
print(MathHelper.clamp(15, 0, 10))
print(MathHelper.clamp(-5, 0, 10))

‎@staticmethod‎ مقابل دالة الوحدة

إذا لم تكن الدالة بحاجة إلى الفئة، فيمكن أن تكون دالة على مستوى الوحدة. استخدم ‎@staticmethod‎ فقط عندما تكون الدالة تابعة منطقيًا للفئة.
class Validator:
    @staticmethod
    def is_email(s): return '@' in s and '.' in s
print(Validator.is_email('user@example.com'))
print(Validator.is_email('not-an-email'))

الاستدعاء من كائن

يمكنك استدعاء كل من ‎@classmethod‎ و‎@staticmethod‎ على الكائنات، لكن سلوك ‎cls‎ وعدم وجود وسيط أول لا يتغير.
class C:
    @classmethod
    def who(cls): return cls.__name__
    @staticmethod
    def pi(): return 3.14
c = C()
print(c.who())
print(c.pi())

أسلوب الفئة للكائنات الأحادية

يمكن لأساليب الفئة فرض أنماط الكائن الأحادي عبر التحقق مما إذا كان كائن ما موجودًا بالفعل.
class Singleton:
    _instance = None
    @classmethod
    def get(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
a = Singleton.get()
b = Singleton.get()
print(a is b)

تجاوز أساليب الفئة

يمكن لفئة فرعية تجاوز أسلوب فئة. وعندها يكون ‎cls‎ هو الفئة الفرعية، مع الحفاظ على تعدد الأشكال.
class Base:
    @classmethod
    def info(cls): return f'{cls.__name__} info'
class Child(Base): pass
print(Base.info())
print(Child.info())

التحقق من النوع باستخدام ‎cls‎

يكون ‎cls‎ داخل أسلوب الفئة هو الفئة الفعلية. استخدم ‎cls()‎ لإنشاء الكائنات، ولا تكتب اسم الفئة مباشرة.
class Shape:
    @classmethod
    def make(cls):
        return cls()  # NOT Shape()
class Square(Shape): pass
print(type(Square.make()).__name__)

الدمج مع ‎@property‎

يمكن دمج قيمة مخزنة مؤقتًا على مستوى الفئة مع ‎@classmethod‎ وخاصية فئة لتحقيق التخزين المؤقت على مستوى الفئة.
class Config:
    _data = None
    @classmethod
    def load(cls):
        if cls._data is None:
            cls._data = {'debug': True}
        return cls._data
print(Config.load())

تحقق سريع

ما المقصود بـ ‎cls‎ في ‎@classmethod‎؟

مراجعة

يحصل ‎@classmethod‎ على ‎cls‎: استخدمه للمصانع والمُنشئات البديلة والكائنات الأحادية. ولا يحصل ‎@staticmethod‎ على شيء: استخدمه للأدوات المساعدة. و‎cls‎ هي الفئة الفعلية أو الفئة الفرعية.

واصل التقدم

تقدم ممتاز! واصل التقدم لإتقان المفهوم التالي.

الأسئلة الشائعة

هل درس «@classmethod و@staticmethod» مجاني؟

نعم — نص درس «@classmethod و@staticmethod» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «@classmethod و@staticmethod»؟

عرّف الطرق الخاصة بمستوى الفئة والطرق الساكنة باستخدام المزخرفات المناسبة تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «@classmethod و@staticmethod»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال ككائنات من الدرجة الأولى
  2. كتابة مزخرفات مخصصة
  3. المزخرف @property
  4. @classmethod و@staticmethod
← العودة إلى Python Academy