کنترل دسترسی به ویژگیهای شیء
پایتون سطح دسترسی سختگیرانه مانند private در برخی زبانهای دیگر ندارد، اما با قرارداد نامگذاری و دکوراتور @property میتوان کپسولهسازی مؤثری پیاده کرد. نامگذاری با یک خط زیرین (_name) یعنی «داخلی» و استفادهی مستقیم از بیرون توصیه نمیشود؛ نامگذاری با دو خط زیرین (__name) باعث name mangling شده و دسترسی مستقیم از بیرون کلاس را دشوارتر میکند.
class Account:
def __init__(self, balance):
self._balance = balance
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if value < 0:
raise ValueError("موجودی نمیتواند منفی باشد")
self._balance = value
acc = Account(1000)
acc.balance = 1500 # از طریق setter
print(acc.balance) # از طریق getterمزیت اصلی property این است که از بیرون کلاس، دسترسی به balance دقیقاً مثل یک ویژگی معمولی به نظر میرسد، در حالی که در پشت صحنه اعتبارسنجی و منطق دلخواه اجرا میشود. این الگو به شما اجازه میدهد بدون تغییر رابط بیرونی کلاس، منطق داخلی را تغییر دهید؛ یکی از اصول مهم طراحی نرمافزار پایدار.
همچنین میتوانید @property بدون setter تعریف کنید تا ویژگی فقطخواندنی باشد، که برای مقادیر محاسبهشده مانند سطح یک دایره بر اساس شعاع آن بسیار مناسب است.