مستويات الوصول في Python
| المستوى | الصيغة | مثال | الوصول من الخارج |
|---|---|---|---|
| Public | name | self.name | مسموح |
| Protected | _name | self._name | مسموح (غير مُشجَّع) |
| Private | __name | self.__name | غير مباشر (_Class__name) |
## الكبسلة (Encapsulation)
إخفاء التفاصيل الداخلية للكائن وحماية البيانات من الوصول المباشر.
### مستويات الوصول في Python: - **public:** `self.name` - الكل يصل - **protected:** `self._name` - اتفاقية "للداخل فقط" (يمكن الوصول لكن غير مُشجَّع) - **private:** `self.__name` - Python تُغيّر اسمها (name mangling)
### Getters و Setters: ```python class Person: def __init__(self, age): self.__age = age # private @property def age(self): # getter return self.__age @age.setter def age(self, value): # setter if value > 0: self.__age = value ```
| 1 | class BankAccount: |
| 2 | def __init__(self, owner, balance): |
| 3 | self.owner = owner # public |
| 4 | self.__balance = balance # private |
| 5 | |
| 6 | @property |
| 7 | def balance(self): # getter |
| 8 | return self.__balance |
| 9 | |
| 10 | def deposit(self, amount): |
| 11 | if amount > 0: |
| 12 | self.__balance += amount |
| 13 | else: |
| 14 | raise ValueError("المبلغ يجب أن يكون موجباً") |
| 15 | |
| 16 | def withdraw(self, amount): |
| 17 | if 0 < amount <= self.__balance: |
| 18 | self.__balance -= amount |
| 19 | else: |
| 20 | raise ValueError("مبلغ غير صالح أو رصيد غير كافٍ") |
مثال 1: Encapsulation كاملة
| 1 | class Temperature: |
| 2 | def __init__(self, celsius=0): |
| 3 | self.__celsius = celsius |
| 4 | |
| 5 | @property |
| 6 | def celsius(self): |
| 7 | return self.__celsius |
| 8 | |
| 9 | @celsius.setter |
| 10 | def celsius(self, value): |
| 11 | if value < -273.15: |
| 12 | raise ValueError("درجة حرارة أقل من الصفر المطلق!") |
| 13 | self.__celsius = value |
| 14 | |
| 15 | @property |
| 16 | def fahrenheit(self): |
| 17 | return self.__celsius * 9/5 + 32 |
| 18 | |
| 19 | @property |
| 20 | def kelvin(self): |
| 21 | return self.__celsius + 273.15 |
| 22 | |
| 23 | temp = Temperature(25) |
| 24 | print(f"سيلسيوس: {temp.celsius}°C") |
| 25 | print(f"فهرنهايت: {temp.fahrenheit}°F") |
| 26 | print(f"كلفن: {temp.kelvin}K") |
| 27 | |
| 28 | temp.celsius = 100 |
| 29 | print(f"بعد التغيير: {temp.celsius}°C = {temp.fahrenheit}°F") |