Python • المستوى الثالث • الدرس 3
العودة لفهرس المستوىالمغلفات والخصائص الخاصة (Encapsulation & Private Attributes)
أهداف الدرس العلمية
- حماية الخصائص الحساسة بإسباقها بـ
__لمنع الوصول المباشر من خارج الصنف. - إنشاء دوال التحكم (Getters & Setters) للوصول الآمن وتعديل القيم.
- استخدام
@propertyكطريقة حديثة وأنيقة لقراءة القيم. - التعامل مع
AttributeErrorلفهم كيف تمنع Python الوصول للخصائص الخاصة.
1. ما هي الكبسولة Encapsulation؟
هي حجب التفاصيل الداخلية وإتاحة واجهة تفاعلية آمنة لمنع التغييرات غير المصرح بها أو العشوائية في المتغيرات الهامة للأنظمة المالية والتطبيقية.
python
class Wallet:
def __init__(self, balance):
self.__balance = balance # 🔒 خاصية خاصة
def get_balance(self):
return self.__balance
def add_money(self, amount):
if amount > 0:
self.__balance += amount
w = Wallet(500)
print(w.get_balance()) # ✅ 500
# ❌ هذا سيُسبب AttributeError
# print(w.__balance)2. مستويات الوصول في Python
🌐 public
بدون شرطات بادئة. متاح من أي مكان:
self.name = name
🟡 _protected
بشرطة سفلية واحدة. اتفاق اجتماعي فقط (لا يمنع):
self._internal = x
🔒 __private
بشرطتين. Python تُشوّه الاسم لمنع الوصول المباشر:
self.__balance = x
3. الفرق بين Getter التقليدي و @property
📋 الطريقة التقليدية
def get_balance(self):
return self.__balance
# الاستخدام:
account.get_balance()✨ الطريقة الحديثة @property
@property
def balance(self):
return self.__balance
# الاستخدام:
account.balance التطبيق العملي المباشر
تحدي الدرس الثالث: نظام بنكي محمي بالكامل
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- أضف ميثود
withdraw(amount)داخل الصنف تسحب من الرصيد بعد التحقق من:
• أن المبلغ> 0
• أن المبلغ≤ self.__balance(رصيد كافٍ) - استخدم
@propertyلإنشاء خاصيةbalanceتُرجع الرصيد الخاص. - جرّب السحب بمبلغ
300ثم بمبلغ5000(أكبر من الرصيد) لملاحظة الفرق. - حاول الوصول المباشر لـ
account.__balanceداخلtry/except AttributeErrorلطباعة رسالة تأكيد الحماية.
⏳ جارٍ تحميل المحرر التفاعلي...