تكرار السؤال: …
الإجابة المختصرة
تسمح property بعرض قيمة محسوبة أو محمية بالتحقق عبر صيغة attribute عادية، ويمكنك البدء بـ attribute بسيطة ثم تحويلها إلى property لاحقًا دون كسر الواجهة.
الشرح
في Python لا داعي لكتابة getX و setX مسبقًا كما في Java؛ ابدأ بـ attribute عامة، وعندما تحتاج تحققًا أو حسابًا حوّلها إلى property. الـ property هي descriptor في الأساس. يجب أن تبقى قراءتها رخيصة وبدون آثار جانبية مفاجئة؛ فإذا كانت تنفذ I/O أو حسابًا ثقيلًا فالأوضح جعلها method صريحة، أو استخدام functools.cached_property للقيم المكلفة التي لا تتغير.
مثال بالكود
class Account:
def __init__(self, balance: int):
self.balance = balance # يمر عبر setter
@property
def balance(self) -> int:
return self._balance
@balance.setter
def balance(self, value: int) -> None:
if value < 0:
raise ValueError("balance cannot be negative")
self._balance = valueأخطاء شائعة
- تنفيذ استعلام قاعدة بيانات داخل property يُستدعى في حلقات دون انتباه.
- كتابة getters و setters لكل حقل بدون حاجة كما في Java.