فصل اول: کلاس‌ها و برنامه‌نویسی شیءگرای عمیق

کپسوله‌سازی با property و attribute خصوصی

کنترل دسترسی به ویژگی‌های شیء

پایتون سطح دسترسی سخت‌گیرانه مانند 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 تعریف کنید تا ویژگی فقط‌خواندنی باشد، که برای مقادیر محاسبه‌شده مانند سطح یک دایره بر اساس شعاع آن بسیار مناسب است.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.