خانه / آموزش‌ها / آموزش کپسوله‌سازی (Encapsulation) در پایتون

آموزش کپسوله‌سازی (Encapsulation) در پایتون

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

کپسوله‌سازی (Encapsulation) یکی از چهار ستون اصلی برنامه‌نویسی شی‌گرا (OOP) است. این مفهوم به معنای بسته‌بندی داده‌ها (متغیرها) و رفتارها (متدها) در یک واحد (کلاس) و محدود کردن دسترسی مستقیم به برخی از اجزای آن شیء است.

به زبان ساده: ما جزئیات داخلی یک کلاس را مخفی می‌کنیم و فقط آنچه را که کاربر نیاز دارد به او نشان می‌دهیم.

۱. سطوح دسترسی (Access Modifiers)

بر خلاف زبان‌هایی مثل Java یا C++، پایتون کلمات کلیدی مثل private یا public ندارد. در عوض، از قراردادهای نام‌گذاری استفاده می‌کند:

  1. عمومی (Public): بدون زیرخط (underscore). از همه جا قابل دسترسی است.
  2. محافظت‌شده (Protected): با یک زیرخط _ شروع می‌شود. فقط باید در داخل کلاس و کلاس‌های فرزند استفاده شود (یک قرارداد اخلاقی بین برنامه‌نویسان).
  3. خصوصی (Private): با دو زیرخط __ شروع می‌شود. پایتون دسترسی به آن را سخت‌تر می‌کند.

مثال ۱: متغیرهای عمومی (Public)

این متغیرها هیچ محدودیتی ندارند و آزادانه قابل تغییر هستند.

Python

مثال ۲: متغیرهای محافظت‌شده (Protected)

با قرار دادن یک _ قبل از نام متغیر، به دیگر برنامه‌نویسان می‌گوییم: "لطفاً این را خارج از کلاس تغییر ندهید، هرچند پایتون جلوی شما را نمی‌گیرد."

Python

مثال ۳: متغیرهای خصوصی (Private)

اگر بخواهیم واقعاً دسترسی را سخت کنیم، از __ استفاده می‌کنیم. پایتون نام این متغیر را تغییر می‌دهد تا به راحتی از بیرون کلاس دیده نشود.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، باید بدانیم که "خصوصی" بودن در پایتون مطلق نیست. پایتون یک زبان Consenting Adults است؛ یعنی فرض می‌کند برنامه‌نویسان عاقل هستند و اگر چیزی را مخفی کردیم، دلیل موجهی داشته‌ایم، اما راه نفوذ را کاملاً نمی‌بندد.

مکانیزم Name Mangling

وقتی متغیری را به صورت __var تعریف می‌کنید، مفسر پایتون نام آن را در حافظه به صورت _ClassName__var تغییر می‌دهد. این کار برای جلوگیری از تداخل نام‌ها در ارث‌بری (Inheritance) است، نه صرفاً برای امنیت.

مثال ۴: دور زدن متغیرهای Private

شما می‌توانید با دانستن الگوی Name Mangling به متغیرهای خصوصی دسترسی پیدا کنید.

Python

کپسوله‌سازی صحیح با Getter و Setter

روش حرفه‌ای برای مدیریت دسترسی‌ها، استفاده از متدها برای کنترل ورودی و خروجی است (هرچند @property پایتونیک‌تر است، اما درک این منطق ضروری است).

نمودار کپسوله‌سازی

python
# 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 * استفاده می‌کند، پایتون به صورت پیش‌فرض اسامی که با _ شروع می‌شوند را ایمپورت نمی‌کند.

Python

نکات فنی نهایی

  1. امنیت نیست: کپسوله‌سازی در پایتون برای جلوگیری از اشتباهات برنامه‌نویسی (Accidental Overwrites) است، نه برای امنیت سایبری. داده‌های حساس مثل پسوردها نباید صرفاً با __ در حافظه ذخیره شوند.
  2. __dict__: تمام ویژگی‌های یک آبجکت معمولاً در obj.__dict__ ذخیره می‌شوند که می‌توان آن را بازرسی کرد.
Python