🧠 فهم Class Methods في بايثون: دليلك الشامل للمبتدئين

مرحباً بك في درس جديد من سلسلة تعلم البرمجة كائنية التوجه (OOP) في بايثون! اليوم سنتعرف على مفهوم مهم جداً وهو Class Methods أو الطرق الخاصة بالكلاس. إذا كنت تتساءل عن الفرق بين الطرق العادية وطرق الكلاس، فأنت في المكان الصحيح! 🎯


📚 ما هي Class Methods؟

Class Methods هي دوال (Methods) تنتمي إلى الكلاس نفسه وليس إلى الكائن (Instance) المنفرد. هذا يعني أنه يمكننا استدعاؤها مباشرة من اسم الكلاس دون الحاجة إلى إنشاء كائن منه أولاً!

الميزة الرئيسية: تعمل Class Methods على مستوى الكلاس ككل، وليس على مستوى الكائنات الفردية.

class Student:
    # هذا متغير خاص بالكلاس (Class Variable)
    school_name = "Codex Academy"
    
    @classmethod
    def get_school_name(cls):
        return cls.school_name

# يمكننا استدعاء الطريقة مباشرة من الكلاس
print(Student.get_school_name())  # المخرج: Codex Academy

في المثال أعلاه، لاحظ أننا استدعينا get_school_name() مباشرة من Student دون إنشاء كائن!


🔧 كيفية تعريف Class Methods

لتعريف Class Method، نستخدم ديكوراتور @classmethod قبل تعريف الدالة. المعلمة الأولى يجب أن تكون cls (اختصار لـ class) والتي تشير إلى الكلاس نفسه.

class Car:
    wheels = 4  # خاصية مشتركة بين جميع السيارات
    
    def __init__(self, brand, color):
        self.brand = brand  # خاصية خاصة بكل كائن
        self.color = color
    
    @classmethod
    def get_wheel_count(cls):
        # cls تشير إلى الكلاس Car نفسه
        return cls.wheels

# الاستخدام
print(Car.get_wheel_count())  # المخرج: 4

# يمكننا أيضاً استدعاؤها من الكائن
my_car = Car("Toyota", "Red")
print(my_car.get_wheel_count())  # المخرج: 4 أيضًا

⚖️ الفرق بين Class Methods و Instance Methods

لنفهم الفرق بشكل أوضح، دعنا نقارن بين النوعين:

النوع ينتمي إلى المعلمة الأولى الاستخدام
Instance Method الكائن (Object) self يعمل على بيانات الكائن المنفرد
Class Method الكلاس (Class) cls يعمل على بيانات الكلاس المشتركة
class BankAccount:
    # متغير خاص بالكلاس
    bank_name = "البنك الوطني"
    interest_rate = 0.05
    
    def __init__(self, owner, balance):
        # متغيرات خاصة بكل كائن
        self.owner = owner
        self.balance = balance
    
    # Instance Method - تعمل على الكائن
    def deposit(self, amount):
        self.balance += amount
        return f"تم إيداع {amount}. الرصيد الجديد: {self.balance}"
    
    # Class Method - تعمل على الكلاس
    @classmethod
    def get_bank_info(cls):
        return f"اسم البنك: {cls.bank_name}, سعر الفائدة: {cls.interest_rate}"

# استخدام Class Method
print(BankAccount.get_bank_info())  # يعمل دون إنشاء كائن

# استخدام Instance Method
account = BankAccount("أحمد", 1000)
print(account.deposit(500))  # يعمل على الكائن المحدد

🏭 الاستخدام الشائع: المنشئات البديلة (Alternative Constructors)

أحد أكثر استخدامات Class Methods فائدة هو إنشاء منشئات بديلة تسمح لنا بإنشاء كائنات بطرق مختلفة.

class Date:
    def __init__(self, day, month, year):
        self.day = day
        self.month = month
        self.year = year
    
    @classmethod
    def from_string(cls, date_string):
        # نقسم النص إلى أجزاء: "15-08-2024" → ["15", "08", "2024"]
        day, month, year = date_string.split("-")
        # نعيد كائن جديد باستخدام المنشئ الأساسي
        return cls(int(day), int(month), int(year))
    
    def display(self):
        return f"{self.day}/{self.month}/{self.year}"

# الطريقة التقليدية
date1 = Date(15, 8, 2024)
print(date1.display())  # المخرج: 15/8/2024

# باستخدام Class Method كمنشئ بديل
date2 = Date.from_string("20-12-2024")
print(date2.display())  # المخرج: 20/12/2024

💡 متى نستخدم Class Methods؟

  1. عندما تحتاج العمل على بيانات مشتركة بين جميع الكائنات
  2. لإنشاء منشئات بديلة بطرق مختلفة لإنشاء الكائنات
  3. عندما تريد تنفيذ عمليات متعلقة بالكلاس وليس بكائن معين
class Product:
    # متغير خاص بالكلاس
    tax_rate = 0.15
    
    def __init__(self, name, price):
        self.name = name
        self.price = price
    
    @classmethod
    def set_tax_rate(cls, new_rate):
        cls.tax_rate = new_rate
        return f"تم تغيير نسبة الضريبة إلى {new_rate}"
    
    @classmethod
    def calculate_tax(cls, price):
        return price * cls.tax_rate

# تغيير الضريبة للكلاس كله
Product.set_tax_rate(0.20)

# حساب الضريبة لأي سعر
tax = Product.calculate_tax(100)
print(f"الضريبة على 100 هي: {tax}")  # المخرج: الضريبة على 100 هي: 20.0

❌ الأخطاء الشائعة وتجنبها

خطأ شائع: نسيان استخدام @classmethod أو استخدام self بدلاً من cls

class Example:
    @classmethod
    def correct_method(cls):  # ✅ صحيح
        return "هذا صحيح"
    
    def wrong_method(self):   # ❌ خطأ (هذا instance method)
        return "هذا خطأ إذا أردت class method"

# الصحيح
Example.correct_method()

# الخطأ (سيسبب خطأ إلا إذا أنشأت كائن أولاً)
# Example.wrong_method()  # سيفشل!

🎯 خلاصة الدرس

  • Class Methods تنتمي للكلاس وليس للكائنات المنفردة
  • نعرفها باستخدام @classmethod والمعلمة cls
  • يمكن استدعاؤها مباشرة من اسم الكلاس
  • مفيدة للعمل على البيانات المشتركة وإنشاء منشئات بديلة