آموزش پایتون - متغیرهای خصوصی

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

مباحث زیر در این فصل پوشش داده می‌شوند -

  • متغیرهای خصوصی چیستند؟
  • تعریف متغیرهای خصوصی در پایتون
  • درهم‌سازی نام (Name Mangling) برای متغیرهای خصوصی
  • متدهای خصوصی در پایتون
  • مثال دنیای واقعی از متغیرهای خصوصی
  • مقایسه متغیرهای عمومی، محافظت‌شده و خصوصی

متغیرهای خصوصی چیستند؟

متغیرهای خصوصی نوع خاصی از متغیرها هستند که تنها در داخل کلاسی که در آن تعریف شده‌اند، قابل دسترسی می‌باشند. این بدان معناست که آن‌ها مستقیماً از بیرون کلاس یا از هیچ زیرکلاسی قابل دسترسی نیستند. این کار برای محافظت از داده‌ها و اطمینان از اینکه توسط قطعه‌کدهای غیرمجاز تغییر نمی‌کنند یا دستکاری نمی‌شوند، انجام می‌شود.

تنها دسترسی مستقیم محدود شده است. ما می‌توانیم یک متد عمومی برای دسترسی به متغیر خصوصی از بیرون کلاس تعریف کنیم که به آن متد گتر (getter method) می‌گویند. به همین ترتیب، می‌توانیم از یک متد ستر (setter method) برای تغییر مقدار یک متغیر خصوصی از بیرون کلاس استفاده کنیم.

تصویر زیر نشان می‌دهد که چگونه متغیرهای خصوصی با متغیرهای عمومی و محافظت‌شده متفاوت هستند.

Variables Comparison

  • متغیرهای عمومی (Public Variables): متغیرهای عمومی از هر جایی، هم در داخل و هم در خارج از کلاس قابل دسترسی هستند. در تصویر، یک مکان عمومی به عنوان شباهتی برای متغیرهای عمومی در نظر گرفته شده است زیرا هر کسی می‌تواند به آن دسترسی داشته باشد.
  • متغیرهای محافظت‌شده (Protected Variables): متغیرهای محافظت‌شده در داخل کلاس و زیرکلاس‌های آن قابل دسترسی هستند. در تصویر، یک خانه شخصی به عنوان شباهتی برای متغیرهای محافظت‌شده در نظر گرفته شده است زیرا اعضای خانواده (زیرکلاس‌ها) می‌توانند به آن دسترسی داشته باشند اما افراد غریبه نه.
  • متغیرهای خصوصی (Private Variables): متغیرهای خصوصی فقط در داخل کلاسی که در آن تعریف شده‌اند قابل دسترسی هستند. در تصویر، یک گاوصندوق به عنوان شباهتی برای متغیرهای خصوصی در نظر گرفته شده است زیرا فقط مالک (خود کلاس) می‌تواند به آن دسترسی داشته باشد و نه هیچ کس دیگری.

تعریف متغیرهای خصوصی در پایتون

در پایتون، متغیرهای خصوصی با افزودن یک خط زیرین دوگانه (__) قبل از نام متغیر تعریف می‌شوند. برخلاف سایر زبان‌های برنامه‌نویسی مانند جاوا یا ++C، پایتون دارای اصلاح‌کننده‌های دسترسی سخت‌گیرانه‌ای مانند عمومی، خصوصی یا محافظت‌شده نیست. بنابراین، خط زیرین دوگانه یک قرارداد است که نشان می‌دهد یک متغیر خصوصی است. به همین ترتیب، یک خط زیرین تکی (_) برای نشان دادن محافظت‌شده بودن یک متغیر استفاده می‌شود.

مثال

کد زیر نحوه تعریف یک متغیر خصوصی و دسترسی به آن را با استفاده از یک متد عمومی نشان می‌دهد.

class MyClass:
    def __init__(self):
        self.__private_var = "I am Private"

    def show_private(self):
        return self.__private_var

obj = MyClass()
# print(obj.__private_var)   # ✗ AttributeError
print(obj.show_private())    # ✓ Access through method

ما دسترسی مستقیم به متغیر خصوصی را کامنت کرده‌ایم (خارج کردن آن از حالت کامنت باعث بروز خطا یا همان AttributeError می‌شود). بنابراین، خروجی کد بالا برابر خواهد بود با -

I am Private

درهم‌سازی نام (Name Mangling) برای متغیرهای خصوصی

در پایتون، متغیرهای خصوصی کاملاً خصوصی نیستند. آن‌ها همچنان می‌توانند از بیرون کلاس با استفاده از تکنیکی به نام درهم‌سازی نام (Name Mangling) دسترسی داشته باشند. به این صورت که وقتی یک متغیر خصوصی با استفاده از خط زیرین دوگانه (var__) ایجاد می‌کنید، پایتون به صورت داخلی نام آن را به _ClassName__var تغییر می‌دهد. حال، می‌توانید با استفاده از این نام درهم‌سازی‌شده به متغیر خصوصی دسترسی پیدا کنید. در ادامه یک مثال برای درک بهتر این موضوع می‌بینیم.

class MyClass:
    def __init__(self):
        self.__private_var = "I am Private"

    def show_private(self):
        return self.__private_var

obj = MyClass()
# Accessing private variable using name mangling
print(obj._MyClass__private_var)  # ✓ Access using name mangling

خروجی کد بالا برابر خواهد بود با -

I am Private

متدهای خصوصی در پایتون

مشابه متغیرهای خصوصی، می‌توانیم متدهای خصوصی را نیز در پایتون تعریف کنیم. متدهای خصوصی متدهایی هستند که فقط در داخل کلاسی که در آن تعریف شده‌اند قابل دسترسی می‌باشند. آن‌ها از بیرون کلاس یا از هیچ زیرکلاسی قابل دسترسی نیستند. برای تعریف یک متد خصوصی، از یک خط زیرین دوگانه (__) قبل از نام متد استفاده می‌کنیم.

class MyClass:
    def __init__(self):
        self.__private_var = "I am Private"

    def __private_method(self):
        return "This is a private method"

    def show_private(self):
        return self.__private_var + " and " + self.__private_method()

obj = MyClass()
print(obj.show_private())    # ✓ Access through method
# print(obj.__private_method())  # ✗ AttributeError
print(obj._MyClass__private_method())  # ✓ Access using name mangling

خروجی کد بالا برابر خواهد بود با -

I am Private and This is a private method
This is a private method

مثال دنیای واقعی از متغیرهای خصوصی

یک برنامه بانکی را در نظر بگیرید که در آن کلاسی به نام BankAccount داریم. این کلاس دارای متغیرهای خصوصی برای شماره حساب و موجودی است. ما متدهای عمومی را برای واریز، برداشت و بررسی موجودی تعریف خواهیم کرد. باید اطمینان حاصل کنیم که موجودی نمی‌تواند مستقیماً در خارج از کلاس تغییر کند، بلکه تنها از طریق متدهای واریز و برداشت قابل تغییر است.

کد زیر این مفهوم را نشان می‌دهد.

class BankAccount:
    def __init__(self, account_number, balance):
        self.__account_number = account_number   # Private
        self.__balance = balance                 # Private

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
        return self.__balance

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
        return self.__balance

    def get_balance(self):
        return self.__balance

account = BankAccount("12345", 1000)

# Direct access will fail
try:
    account.__balance += 500  # ✗ AttributeError
except AttributeError:
    print("Direct access to private variable failed!!!")

# Access using methods
print("Your account balance is: ", account.get_balance())   # ✓ 1000

account.deposit(500)
print("Your account balance after deposit is: ", account.get_balance())  # ✓ 1500

خروجی کد بالا برابر خواهد بود با -

Direct access to private variable failed!!!
Your account balance is:  1000
Your account balance after deposit is:  1500

مقایسه متغیرهای عمومی، محافظت‌شده و خصوصی

در اینجا یک مقایسه جدولی از متغیرهای عمومی، محافظت‌شده و خصوصی در پایتون آورده شده است -

ویژگی متغیرهای عمومی متغیرهای محافظت‌شده متغیرهای خصوصی
تعریف متغیرهایی که از هر جایی قابل دسترسی هستند. متغیرهایی که در داخل کلاس و زیرکلاس‌های آن قابل دسترسی هستند. متغیرهایی که فقط در داخل کلاسی که در آن تعریف شده‌اند قابل دسترسی هستند.
سنتکس int var int _var int __var
امنیت کمترین امنیت امنيت متوسط بیشترین امنیت
مثال int age = 25 int _age = 25 int __age = 25

نتیجه‌گیری

در این فصل، در مورد متغیرهای خصوصی در پایتون و نحوه استفاده از آن‌ها برای دستیابی به کپسوله‌سازی یاد گرفتیم. همچنین در مورد درهم‌سازی نام، نحوه کار متدهای خصوصی، و متدهای گتر و ستر بحث کردیم. تکنیک درهم‌سازی نام به ما امکان می‌دهد از بیرون کلاس به متغیرها و متدهای خصوصی دسترسی داشته باشیم، اما استفاده از آن توصیه نمی‌شود زیرا اصل کپسوله‌سازی را نقض می‌کند.

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.