🐍 Class Properties في بايثون: التحكم الذكي في سمات الكلاس 🚀
مرحباً بك في درس Class Properties! إذا كنت قد تعلمت سابقاً عن الكلاسات والكائنات في بايثون، فأنت تعلم أننا نستخدم السمات (Attributes) لتخزين البيانات. لكن ماذا لو أردنا التحكم في كيفية الوصول إلى هذه البيانات وتعديلها؟ هذا بالضبط دور الـ Properties!
📚 ما هي Class Properties؟
الخصائص (Properties) هي طريقة متقدمة للتعامل مع سمات الكلاس تتيح لنا التحكم في كيفية قراءة، كتابة، وحذف البيانات. بدلاً من الوصول المباشر إلى السمات، نستخدم دوال خاصة تمنحنا مرونة وأماناً أكبر.
الفرق الجوهري:
- السمات (Attributes): وصول مباشر للبيانات
- الخصائص (Properties): وصول محمي عبر دوال خاصة
class Student:
def __init__(self, name):
self.name = name # هذه سمة عادية (Attribute)
# مثال على Property سنتعلمه لاحقاً
🔧 لماذا نستخدم Properties؟
هناك عدة أسباب مهمة لاستخدام الخصائص:
- التحقق من صحة البيانات ✅
- حساب قيم ديناميكية ⚡
- إخفاء التطبيق الداخلي 🔒
- الحفاظ على التوافق 🔄
🎯 الديكوراتور @property - الأساسيات
أسهل طريقة لإنشاء Property هي استخدام الديكوراتور @property. هذا يحول دالة إلى Property للقراءة فقط.
class Circle:
def __init__(self, radius):
self._radius = radius # نستخدم _ للإشارة أن هذه سمة خاصة
@property
def radius(self):
"""خاصية للوصول إلى نصف القطر"""
return self._radius
# الاستخدام
my_circle = Circle(5)
print(my_circle.radius) # 5 - نستخدمها كسمة عادية!
ملاحظة: لاحظ أننا نستخدم my_circle.radius بدون أقواس! هذا لأن @property حولت الدالة إلى Property.
✏️ إضافة Setter للتحكم في الكتابة
لجعل الخاصية قابلة للكتابة، نستخدم ديكوراتور @property_name.setter.
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
"""Setter مع التحقق من صحة البيانات"""
if value <= 0:
raise ValueError("يجب أن يكون نصف القطر أكبر من الصفر")
self._radius = value
# الاستخدام
my_circle = Circle(5)
print(my_circle.radius) # 5
my_circle.radius = 10 # التعديل يعمل
print(my_circle.radius) # 10
# my_circle.radius = -5 # سيسبب خطأ: ValueError
🗑️ إضافة Deleter للتحكم في الحذف
يمكننا أيضاً التحكم في عملية حذف الخاصية باستخدام @property_name.deleter.
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("يجب أن يكون نصف القطر أكبر من الصفر")
self._radius = value
@radius.deleter
def radius(self):
"""Deleter للتحكم في عملية الحذف"""
print("جارٍ حذف نصف القطر...")
del self._radius
# الاستخدام
my_circle = Circle(5)
del my_circle.radius # سيُنفذ الدالة deleter
📊 مثال متكامل: خاصية محسوبة
الخصائص رائعة لحساب قيم ديناميكية بناءً على سمات أخرى.
class Circle:
def __init__(self, radius):
self.radius = radius # نستخدم الخاصية التي أنشأناها!
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("يجب أن يكون نصف القطر أكبر من الصفر")
self._radius = value
@property
def area(self):
"""خاصية محسوبة - مساحة الدائرة"""
return 3.14159 * self._radius ** 2
@property
def circumference(self):
"""خاصية محسوبة - محيط الدائرة"""
return 2 * 3.14159 * self._radius
# الاستخدام
my_circle = Circle(7)
print(f"نصف القطر: {my_circle.radius}") # 7
print(f"المساحة: {my_circle.area:.2f}") # 153.94
print(f"المحيط: {my_circle.circumference:.2f}") # 43.98
💡 أفضل الممارسات مع Properties
- استخدم _ للسمات الداخلية 🛡️
- اجعل الخصائص بسيطة وسريعة ⚡
- استخدم الخصائص للتحقق من صحة البيانات ✅
- تجنب العمليات البطيئة في الخصائص 🐌
class BankAccount:
def __init__(self, balance):
self._balance = balance
@property
def balance(self):
"""التحقق من وجود رصيد كافٍ قبل السحب"""
return self._balance
@balance.setter
def balance(self, amount):
if amount < 0:
raise ValueError("الرصيد لا يمكن أن يكون سالباً")
self._balance = amount
# استخدام آمن للبيانات
account = BankAccount(1000)
account.balance = 500 # يعمل
# account.balance = -100 # خطأ!
🎉 خلاصة الدرس
تعلمنا في هذا الدرس:
- ما هي Class Properties وكيف تختلف عن السمات العادية
- كيفية استخدام @property لإنشاء خصائص للقراءة
- إضافة Setters وDeleters للتحكم الكامل
- إنشاء خصائص محسوبة ديناميكياً
- أفضل الممارسات لاستخدام الخصائص بشكل فعال
الخصائص تجعل كودك أكثر أماناً، مرونة، واحترافية! 🏆
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال