NahdaAIنهضة
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
التطبيق العملي المباشر

تحدي الدرس الثالث: نظام بنكي محمي بالكامل

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. أضف ميثود withdraw(amount) داخل الصنف تسحب من الرصيد بعد التحقق من:
    • أن المبلغ > 0
    • أن المبلغ ≤ self.__balance (رصيد كافٍ)
  2. استخدم @property لإنشاء خاصية balance تُرجع الرصيد الخاص.
  3. جرّب السحب بمبلغ 300 ثم بمبلغ 5000 (أكبر من الرصيد) لملاحظة الفرق.
  4. حاول الوصول المباشر لـ account.__balance داخل try/except AttributeError لطباعة رسالة تأكيد الحماية.
⏳ جارٍ تحميل المحرر التفاعلي...