سطح مقدماتی (Beginner Level)
کپسولهسازی (Encapsulation) یکی از چهار ستون اصلی برنامهنویسی شیگرا (OOP) است. این مفهوم به معنای بستهبندی دادهها (متغیرها) و رفتارها (متدها) در یک واحد (کلاس) و محدود کردن دسترسی مستقیم به برخی از اجزای آن شیء است.
به زبان ساده: ما جزئیات داخلی یک کلاس را مخفی میکنیم و فقط آنچه را که کاربر نیاز دارد به او نشان میدهیم.
۱. سطوح دسترسی (Access Modifiers)
بر خلاف زبانهایی مثل Java یا C++، پایتون کلمات کلیدی مثل private یا public ندارد. در عوض، از قراردادهای نامگذاری استفاده میکند:
- عمومی (Public): بدون زیرخط (underscore). از همه جا قابل دسترسی است.
- محافظتشده (Protected): با یک زیرخط
_شروع میشود. فقط باید در داخل کلاس و کلاسهای فرزند استفاده شود (یک قرارداد اخلاقی بین برنامهنویسان). - خصوصی (Private): با دو زیرخط
__شروع میشود. پایتون دسترسی به آن را سختتر میکند.
مثال ۱: متغیرهای عمومی (Public)
این متغیرها هیچ محدودیتی ندارند و آزادانه قابل تغییر هستند.
مثال ۲: متغیرهای محافظتشده (Protected)
با قرار دادن یک _ قبل از نام متغیر، به دیگر برنامهنویسان میگوییم: "لطفاً این را خارج از کلاس تغییر ندهید، هرچند پایتون جلوی شما را نمیگیرد."
مثال ۳: متغیرهای خصوصی (Private)
اگر بخواهیم واقعاً دسترسی را سخت کنیم، از __ استفاده میکنیم. پایتون نام این متغیر را تغییر میدهد تا به راحتی از بیرون کلاس دیده نشود.
سطح پیشرفته (Professional Level)
در سطح حرفهای، باید بدانیم که "خصوصی" بودن در پایتون مطلق نیست. پایتون یک زبان Consenting Adults است؛ یعنی فرض میکند برنامهنویسان عاقل هستند و اگر چیزی را مخفی کردیم، دلیل موجهی داشتهایم، اما راه نفوذ را کاملاً نمیبندد.
مکانیزم Name Mangling
وقتی متغیری را به صورت __var تعریف میکنید، مفسر پایتون نام آن را در حافظه به صورت _ClassName__var تغییر میدهد. این کار برای جلوگیری از تداخل نامها در ارثبری (Inheritance) است، نه صرفاً برای امنیت.
مثال ۴: دور زدن متغیرهای Private
شما میتوانید با دانستن الگوی Name Mangling به متغیرهای خصوصی دسترسی پیدا کنید.
کپسولهسازی صحیح با Getter و Setter
روش حرفهای برای مدیریت دسترسیها، استفاده از متدها برای کنترل ورودی و خروجی است (هرچند @property پایتونیکتر است، اما درک این منطق ضروری است).

# Static Example: Logic for Getter/Setter
class Person:
def __init__(self, age):
self.__age = age
def set_age(self, age):
if age < 0:
raise ValueError("Age cannot be negative")
self.__age = age
def get_age(self):
return self.__age
کاربرد در API Design
در طراحی کتابخانهها، استفاده از _ برای توابع و متغیرهای داخلی بسیار حیاتی است. وقتی کاربری از from module import * استفاده میکند، پایتون به صورت پیشفرض اسامی که با _ شروع میشوند را ایمپورت نمیکند.
نکات فنی نهایی
- امنیت نیست: کپسولهسازی در پایتون برای جلوگیری از اشتباهات برنامهنویسی (Accidental Overwrites) است، نه برای امنیت سایبری. دادههای حساس مثل پسوردها نباید صرفاً با
__در حافظه ذخیره شوند. __dict__: تمام ویژگیهای یک آبجکت معمولاً درobj.__dict__ذخیره میشوند که میتوان آن را بازرسی کرد.