🧠 فهم 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؟
- عندما تحتاج العمل على بيانات مشتركة بين جميع الكائنات
- لإنشاء منشئات بديلة بطرق مختلفة لإنشاء الكائنات
- عندما تريد تنفيذ عمليات متعلقة بالكلاس وليس بكائن معين
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 - يمكن استدعاؤها مباشرة من اسم الكلاس
- مفيدة للعمل على البيانات المشتركة وإنشاء منشئات بديلة
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال