کپسوله سازی در پایتون – توضیح به زبان ساده با مثال و کد

۳۰۸ بازدید
آخرین به‌روزرسانی: ۲۰ دی ۱۴۰۲
زمان مطالعه: ۱۲ دقیقه
کپسوله سازی در پایتون – توضیح به زبان ساده با مثال و کد

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

کپسوله سازی در پایتون چیست؟

«کپسوله‌سازی» (Encapsulation) یکی از مفاهیم بنیادی «برنامه‌نویسی شی‌گرایانه» (Object-Oriented Programming | OOP) است. کپسوله‌سازی مستلزم ترکیب داده‌ و متدهای مربوط به ‌آن‌ در یک واحد مجزا به نام «کلاس» (Class) است که دسترسی مستقیم را به متغیرها و متدها محدود می‌کند و باعث جلوگیری از اعمال تغییرات ناخواسته در داده‌ها می‌شود.

مثالی برای درک مفهوم کپسوله سازی

کپسوله‌سازی امکان استفاده دوباره و سازماندهی کدها را بیشتر می‌کند. به‌طور کلی کپسوله‌سازی برای ساخت سیستم‌های نرم‌افزاری پایدار لازم است. کپسوله‌سازی مکانیزمی است که بسته‌بندی داده و متدها را در برنامه‌نویسی شی‌گرایانه، ممکن می‌کند و باعث محدودیت دسترسی به داده‌ها از خارج کلاس می‌شود. متغیرهای عمومی و خصوصی، دو روش کنترل دسترسی به متغیرهای کلاس هستند.

برای درک بیشتر به مثالی عینی نیاز داریم تا بهتر بتوانیم این موقعیت را تصور کنیم. می‌توان از خودرو به‌عنوان مثالی از زندگی واقعی برای این مفهوم استفاده کرد. مثال زیر توجه کنید.

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

چرا به کپسوله سازی در پایتون نیاز داریم؟

کپسوله‌سازی بخش ضروری از همه زبان‌های «برنامه‌نویسی شی‌گرایانه» (Object-Oriented Programming) را تشکیل می‌دهد. از آنجا که کپسوله‌سازی دسترسی به برخی از عناصر اشیا را از طریق دنیای خارج محدود می‌کند، در پایتون هم مورد نیاز است. استفاده از کپسوله‌ سازی در پایتون از دسترسی به وضعیت مقادیر همه متغیرهای درون یک شی منحصر به فرد توسط کاربران، جلوگیری می‌کند.

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

مثال مفهومی برای درک بهتر کپسوله سازی در پایتون

مثال خودرو را در نظر بیاورید. وقتی که درحال راندن خودرویی هستیم، آیا برای ما مهم است که بدانیم خودروها چگونه در کارخانه تولید شده‌اند یا اصلا لازم است که بدانیم؟ آیا نیاز داریم بدانیم که قطعات خودرو چگونه سرهم شده‌اند یا خودرو چگونه طراحی شده است؟ پاسخ همه این سوالات یک «نه» محکم است. ما بدون دانستن این جزییات علاقه‌مند به رانندگی با خودرو هستیم.

به همین شکل، از کپسوله سازی در پایتون استفاده می‌کنیم، فرض کنید متغیری داریم که بیرون از شی استفاده نشده است. به وسیله متدهایی که دسترسی خواندن و نوشتن را برایش فراهم می‌کنند، الآن این متغیر می‌تواند، بسته‌بندی شود. در اینجا، کپسوله سازی در پایتون به کنترل دسترسی به متغیرها و متدهای شی کمک کرده‌ است.

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

«محدودکننده‌‌های دسترسی» (Access Modifiers) کپسوله سازی در پایتون برای محدود کردن دسترسی به اعضای داده‌ای کلاس‌ها و توابع عضو از بیرون کلاس، استفاده می‌شوند. محدودکننده‌های دسترسی برای محافظت از داده‌های داخلی کلاس و موارد مرتبط با کلاس به کار می‌روند.

سه نوع محدودکننده‌ دسترسی وجود دارند که توسط کپسوله سازی در پایتون پشتیبانی می‌شوند. در فهرست زیر به‌صورت کوتاه درباره آن‌ها توضیح داده‌ایم.

  • «محدودکننده‌ دسترسی عمومی» (Public Access Modifier): برای متغیرها و متدهایی که عضو هر کلاس هستند، به‌صورت پیش‌فرض قرار دارد. در این حالت، اعضای داده و ویژگی‌ها از بیرون و داخل کلاس قابل دسترسی هستند.
  • «محدودکننده‌ دسترسی خصوصی» (Private Access Modifier): یک جفت «خط زیر» (Underscore) ــ  به عنوان پیشوند اسم متغیرها یا متدها، نشانگر این است که این اعضای داخلی کلاس به‌صورت خصوصی، محافظت شده‌اند. در این حالت، اعضای داده‌ و متدها فقط از درون کلاس قابل دسترسی هستند.
  • «محدودکننده‌ دسترسی محافظت شده» (Protected Access Modifier):یک خط زیر ـ  به عنوان پیشوند اسم متغیرها یا متدها، نشانگر این است که این اعضای داخلی کلاس محافظت شده‌اند. در این حالت، اعضای داده‌ و متدها فقط از درون کلاس قابل دسترسی هستند، و کلاسی که از این کلاس محافظت شده ارث بری می‌کند. پس اعضا از طریق فرزندان کلاس هم قابل دسترسی هستند.
تصویری که نماد مفهوم کپسوله‌سازی در زبان پایتون با یک مار پایتون داخل یک کپسول حفاظتی را نشان می‌دهد

درباره هر سه محدودکننده‌ دسترسی که در بالا مورد اشاره قرار گرفته‌اند، در ادامه صحبت خواهیم کرد.

محدودکننده‌ دسترسی عمومی

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

1class Employee:
2    def __init__(self, name, age):
3        self.name = name
4        self.age = age
5
6    def display(self):
7        print("Employee Name:", self.name)
8        print("Employee Age:", self.age)
9
10
11s = Student("Mostafa Rashidi", 35)
12s.display()

خروجی کد بالا به این صورت می‌شود.

Employee Name: Mostafa Rashidi
Employee Age: 35

در مثال بالا، کلاسی به نام Employee  را ایجاد کرده‌ایم که اعضای داده‌ای به نام‌های name  و age  دارد. این کلاس عضو تابعی به نام display  نیز دارد. از آنجا که نوع خاصی از مشخص کننده دسترسی را تعیین نکرده‌ایم، به‌صورت پیش‌فرض از نوع «محدودکننده دسترسی عمومی» (Public Access Modifier) خواهد بود. در اینجا، می‌بینیم که به تابع display  از بیرون کلاس دسترسی داریم.

محدودکننده‌ دسترسی محافظت شده

این متغیرها و متدها فقط از طریق کلاس و زیرکلاس‌های آن قابل دسترسی هستند. علامت اعضای محافظت شده کلاس، یک «خط زیر» (Underscore) به‌عنوان پیشوند قبل از اسم آن‌ها است. به محض اینکه از کلاس شی نمونه‌ای ساخته می‌شود، متد سازنده __init__  اجرا می‌شود. برای مثال، به نمونه کدی که در ادامه آمده است توجه کنید.

1class Person:
2    def __init__(self, name, age, _id):
3        self.name = name
4        self.age = age
5        self._id = _id
6
7
8    def display(self):
9        print("Name:", self.name)
10        print("Age:", self.age)
11        print("ID:", self._id)
12
13
14
15class Student(Person):
16    def __init__(self, name, age, _id, marks):
17        super().__init__(name, age, _id)
18        self.marks = marks
19
20
21    def display(self):
22        super().display()
23        print("Marks:", self.marks)

در مثال بالا، کلاس Person  متغیر محافظت شده‌ای به‌نام _id  دارد. این متغیر برنامه‌ریزی شده که فقط درون کلاس و توسط کلاس‌های فرزند این کلاس استفاده‌ شود. کلاس Student  فرزندی برای کلاس Person  است، با متغیر اختصاصی برای خودش به نام marks  .

هر دو کلاس متدی به نام display  دارند که مقدار متغیرهای درونی آن‌ها را نمایش می‌دهد. کلاس Student  متد display  را که از کلاس والد خود به ارث برده، «بازنویسی» (Override) می‌کند تا متغیر marks  هم شامل این متد شود و برای اشیا کلاس Student  نمایش داده‌شود.

  • نکته: «بازنویسی» (Overriding) بیشتر برای تغییر عملکرد توابع و متدهای کلاس‌ها در برنامه نویسی شی‌گرایانه استفاده می‌شود. یعنی اصل ماهیت تابع یا کلاس تغییر نمی‌کند. اما «بازنویسی کردن» (Overwriting) محتویات درونی داده‌ها و متغیرها را جایگزین می‌کند و عنصر Overwrite شده لازم نیست حتما داخل کلاس باشد یا از برنامه نویسی شی‌گرایانه استفاده کرده باشد.

استفاده از یک «Underscore» به عنوان پیشوند در ابتدای نام متغیر _id  بیان‌گر این است که این متغیر از نوع محافظت شده است. محافظت شده به این معنا است که این متغیر نباید از بیرون کلاس خود یا کلاس‌های فرزندش قابل دسترسی یا تغییر باشد اما برعکس از داخل کلاس یا کلاس‌های فرزند باید بتوان به این متغیر دسترسی داشت.

خروجی و توضیح کد نمایش داده شده

برای دیدن خروجی، نیاز داریم که از کلاس‌ها اشیایی بسازیم و متدهای آن‌ها را فراخوانی کنیم. به مثالی که در ادامه آمده‌ است، دقت کنید.

person = Person("John", 25, 12345)
student = Student("Jane", 20, 54321, 90)

person.display()
# Output:
# Name: John
# Age: 25
# ID: 12345

student.display()
# Output:
# Name: Jane
# Age: 20
# ID: 54321
# Marks: 90

در مثال بالا، کلاس Person برای توصیف شخص انسان به صورت ساده، تعریف شده است. شیئی از کلاس Person  به نام person  ایجاد کرده‌ایم. برای این شیء نام name  را برابر John  و سن age  را برابر 25  و شماره شناسایی ID   را برابر 12345  قرار داده‌ایم. همچنین شیئی از کلاس دانش‌آموز Student  به نام student  ساخته‌ایم که برای متغیرهای آن نیز نام name  را برابر Jane  ، سن age  را برابر 20  ، شماره شناسایی ID   را برابر 54321  و در آخر نمره یا marks  را برابر 90  قرار داده‌ایم.

سپس متد display  را از شی شخص Person  فراخوانی کردیم، که نام، سن و شماره شناسایی شخص را روی خروجی چاپ می‌کند. به‌همین شکل، بعد از آن متد display  را از شی دانش‌آموز Student  فراخوانی کردیم، که نام، سن، شماره شناسایی و نمره دانش‌آموز را روی خروجی چاپ می‌کند.

محدودکننده‌ دسترسی خصوصی

در کپسوله سازی در پایتون، عبارت اعضای خصوصی بیان‌گر متدها و متغیرهایی است که فقط از درون کلاس قابل دسترسی‌اند. اعضای خصوصی کلاس با یک جفت «Underscore» بابت پیشوند قبل از نام آن‌ها، نشان‌ داده می‌شوند. برای نمونه می‌توانید به کدی که در ادامه آورده‌ایم توجه کنید.

1class BankAccount:
2    def __init__(self, name, balance):
3        self.name = name
4        self.__balance = balance
5
6
7    def deposit(self, amount):
8        self.__balance += amount
9        print("Deposit successful. New balance:", self.__balance)
10
11
12    def withdraw(self, amount):
13        if amount > self.__balance:
14            print("Insufficient balance.")
15        else:
16            self.__balance -= amount
17            print("Withdrawal successful. New balance:", self.__balance)
18
19
20    def __show_balance(self):
21        print("Current balance:", self.__balance)

در مثال بالا، کلاس حساب بانک BankAccount  متغیر خصوصی به نام __balance  دارد. این متغیر این‌طور پیاده‌سازی شده که فقط درون کلاس خودش استفاده شود. کلاس دارای ۲ متد دیگر به نام‌های withdraw  و deposit  نیز است که میزان متغیر __balance را با توجه به مقدار amount  مشخص شده تغیر می‌دهند.

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

مثالی برای نمایش عملی از کد بالا در تصویر زیر آمده است.

account = BankAccount("John", 1000)

account.deposit(500)
# Output: Deposit successful. New balance: 1500

account.withdraw(2000)
# Output: Insufficient balance.

account.withdraw(1000)
# Output: Withdrawal successful. New balance: 500

account ._ show_balance()
# Output: AttributeError: 'BankAccount' object has no attribute '_show_balance'

در مثالی که در کدهای بالا می‌بینید، شیئی از کلاس BankAccount  به نام account  ساخته‌ایم. متغیر نام name  را برابر با John  و باقی‌مانده balance  را برابر 1000  قراردادیم. سپس متدهای deposit  و withdraw  را از شی ساخته‌شده از کلاس حساب بانک، فراخوانی کردیم تا مبلغ باقی‌مانده حساب balance  را اصلاح کند.

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

ساختمان مرکزی جمع آوری داده ها

مثالی برای کپسوله سازی در پایتون

برای اینکه نشان دهیم «کپسوله سازی در پایتون» (Python Encapsulation) چطور پیاده‌سازی می‌شود، باید کدی را بررسی کنیم. از کلاس Student  استفاده خواهیم کرد.

1class Student:
2   def __init__(self, name, age):
3       self.__name = name  # Private attribute
4       self.__age = age    # Private attribute
5   
6   def get_name(self):
7       return self.__name
8   
9   def set_name(self, name):
10       self.__name = name
11   
12   def get_age(self):
13       return self.__age
14   
15   def set_age(self, age):
16       if age >= 0:
17           self.__age = age
18       else:
19           print("Age cannot be negative!")
20# Creating an instance of the Student class
21student1 = Student("Alice", 20)
22# Accessing private attributes using getter methods
23print("Student's name:", student1.get_name())
24print("Student's age:", student1.get_age())
25# Using setter methods to update private attributes
26student1.set_name("Bob")
27student1.set_age(22)
28print("Updated student's name:", student1.get_name())
29print("Updated student's age:", student1.get_age())
30# Trying to set a negative age (will print an error message)
31student1.set_age(-1)

خروجی این کد به صورت زیر خواهد بود.

Student's name: Alice
Student's age: 20
Updated student's name: Bob
Updated student's age: 22
Age cannot be negative!

در خروجی که در تصویر بالا نمایش داده‌ایم، برای کار کردن با جزييات خصوصی نظیر Attribute-ها در کلاس Student  ، از متدهای خاصی مانند Setter-ها و Getter-ها استفاده کردیم. وقتی که سعی کردیم مقدار متغیر مربوط به سن را با مقداری منفی تنظیم کنیم، برنامه پیغام خطایی را نمایش داد. این اتفاق نشان می‌دهد که کپسوله‌سازی چطور به حفظ یکپارچگی و سلامت داده‌ها کمک می‌کند و دسترسی کنترل شده‌ای نسبت به ویژگی‌های کلاس فراهم می‌کند.

Getter-ها و Setter-ها در پایتون

برای اینکه عمل کپسوله سازی در پایتون به نحو شایسته‌ای اجرا شود، نیاز داریم که از Getter-ها و Setter-ها استفاده کنیم. منظور اصلی استفاده از Getter-ها و Setter-ها در برنامه‌های شی گرایانه، تضمین کپسوله‌سازی داده‌ها است. از متد Getter برای دسترسی و خواندن اعضای داده استفاده کنید و از متدهای Setter برای تغییردادن اعضای داده‌ای استفاده کنید.

در پایتون، متغیرهای خصوصی مانند دیگر زبان‌های برنامه‌نویسی ویژگی‌هایی مخفی نیستند. متدهای Getter-ها و Setter-ها اغلب در موارد زیر به‌کار می‌روند.

  • وقتی که می‌خواهیم از دسترسی مستقیم به متغیرهای خصوصی جلوگیری کنیم.
  • وقتی که می‌خواهیم دلیل معتبری را برای تغییر متغیر خصوصی را در نظر بگیریم. در واقع اجازه دسترسی به متغیر خصوصی را به شرط خاصی می دهیم.

به مثال ارائه شده در کد زیر توجه کنید.

1class Student:
2    def __init__(self, name, age):
3        # private member
4        self.name = name
5        self.__age = age
6
7    # getter method
8    def get_age(self):
9        return self.__age
10
11    # setter method
12    def set_age(self, age):
13        self.__age = age
14
15stud = Student('Jessa', 14)
16
17# retrieving age using getter
18print('Name:', stud.name, stud.get_age())
19
20# changing age using setter
21stud.set_age(16)
22
23# retrieving age using getter
24print('Name:', stud.name, stud.get_age())

خروجی به شکل زیر خواهد بود.

Name: Jessa 14
Name: Jessa 16

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

به عنوان مثال: مخفی‌سازی اطلاعات منطق شرطی برای تنظیم ویژگی‌های یک شی را در کد زیر نمایش داده‌ایم.

1class Student:
2    def __init__(self, name, roll_no, age):
3        # private member
4        self.name = name
5        # private members to restrict access
6        # avoid direct data modification
7        self.__roll_no = roll_no
8        self.__age = age
9
10    def show(self):
11        print('Student Details:', self.name, self.__roll_no)
12
13    # getter methods
14    def get_roll_no(self):
15        return self.__roll_no
16
17    # setter method to modify data member
18    # condition to allow data modification with rules
19    def set_roll_no(self, number):
20        if number > 50:
21            print('Invalid roll no. Please set correct roll number')
22        else:
23            self.__roll_no = number
24
25jessa = Student('Jessa', 10, 15)
26
27# before Modify
28jessa.show()
29# changing roll number using setter
30jessa.set_roll_no(120)
31
32
33jessa.set_roll_no(25)
34jessa.show()

خروجی این کد به‌صورت زیر خواهد بود.

Student Details: Jessa 10
Invalid roll no. Please set correct roll number

Student Details: Jessa 25

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

توجه کنید که گرچه کپسوله کردن برای محافظت از داده‌ها و توابع خاص برای جلوگیری از دسترسی خارج از کلاس ایجاد شده است اما تقریبا در پایتون هیچ کاری نشدنی نیست و این بیشتر به فرم قراردادی مابین توسعه‌‌دهندگان تبدیل شده است. به وسیله «تغییر نام» (Name Mangling) -البته با شرایط خاص- می‌توان به صورت مستقیم به متغیرهای خصوصی و محافظت شده از بیرون از کلاس دسترسی داشت. «تغییر نام» (The Name Mangling) بر روی شناسه‌ها به وسیله اضافه کردن ۲ خط زیر در ابتدای کلمه و یک خط زیر در انتهای کلمه به وجود می‌آید، مانند خط روبه‌رو _classname__dataMember  . توجه کنید در این مثال classname  نام کلاس است و dataMember  نام متغیر خصوصی است.

برای مثال به کد زیر توجه کنید، در این کد روش استفاده ازین تکنیک را نشان داده‌ایم.

1class Employee:
2    # constructor
3    def __init__(self, name, salary):
4        # public data member
5        self.name = name
6        # private member
7        self.__salary = salary
8
9# creating object of a class
10emp = Employee('Jessa', 10000)
11
12print('Name:', emp.name)
13# direct access to private member using name mangling
14print('Salary:', emp._Employee__salary)

خروجی کد بالا به صورت زیر خواهد بود.

Name: Jessa
Salary: 10000

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

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

  1. «مخفی‌سازی داده‌ها» (Data hiding): کپسوله‌سازی با جلوگیری از اعمال تغییرات از خارج از کلاس، به محافظت و نگهداری یکپارچگی داده‌ها کمک می‌کند.
  2. «درک آسانتر» (Easier to understand): کپسوله‌سازی از طریق مخفی کردن جزییات پیاده‌سازی کلاس‌، پیچیدگی کدها را کاهش می‌دهد و با عث محافظت و فهم ساده‌تر کدها می‌شود.
  3. «قابلیت استفاده دوباره از کدها» (Code reusability): کپسوله‌سازی به کمک ایجاد «رابط» (Interface) عمومی برای کلاس که توسط قسمت‌های دیگر برنامه قابل استفاده خواهد بود، امکان استفاده دوباره از کدها را فراهم می‌کند.
  4. «افزایش قابلیت نگهداری» (Improved maintainability): کپسوله‌سازی کنترل بهتری را روی رفتارهای اشیا فراهم می‌کند، مانند تغییراتی که می‌توانند در پیاده‌سازی کلاس‌ها اعمال شوند بدون اینکه روی بقیه برنامه موثر باشند.
  5. «کنترل بهتر روی تنظیمات کلاس» (Better control over class properties): کپسوله‌سازی به‌وسیله محدود کردن دامنه متغیرها و متدها به جایی که تعریف شد‌ه‌اند، یعنی داخل کلاس، از تداخل در نامگذاری این عناصر در کدهای برنامه جلوگیری می‌کند.
تصویری که نماد مفهوم کپسوله‌سازی در زبان پایتون با یک مار پایتون داخل یک کپسول حفاظتی را نشان می‌دهد

سوالات متداول

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

کپسوله سازی چیست و چه مثالی برای آن وجود دارد؟

کپسوله‌سازی برای محدودکردن دسترسی به اعضای داده‌ای و توابع درون کلاس‌ها استفاده می‌شود. به عنوان مثال در کلاس کارمند Employee  اعضای داده‌ای مانند نام Name  و سن Age  را می‌توانیم داشته باشیم. از کپسوله‌سازی برای اختصاصی کردن دسترسی به این اعضای داده‌ای استفاده می‌کنیم. در واقع کاری می‌کنیم که کدهای خارج از کلاس نتوانند در این اعضای داده‌ای دخل و تصرفی بکنند.

کپسوله سازی و انتزاع در پایتون چه هستند؟

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

آیا کپسوله سازی در پایتون ضروری است؟

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

  • مخفی‌سازی داده‌ها
  • قابلیت دوباره استفاده کردن از کدها
  • سازماندهی کدها
  • محافظت از داده‌ها در مقابل دسترسی‌های غیر مجاز

بنابراین، در هنگام کدنویسی در پایتون و استفاده کردن از شی‌گرایی مهم است که به اصول کپسوله‌سازی توجه کنید.

در پایتون دسترسی های عمومی، خصوصی و محافظت شده توسط چه متمایزکننده ای از یکدیگر مشخص می شوند؟

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

جمع بندی

در این مطلب از مجله فرادرس، تلاش کردیم تا حدممکن به بررسی هرچه بهتر مفهوم کپسوله سازی در پایتون همراه با جزییات آن بپردازیم. امیدواریم که این مطلب به درک بهتر شما از مفاهیم برنامه‌نویسی شی‌گرایانه یا OOP در پایتون کمک کرده باشد. مزایای کپسوله سازی را یادگرفتیم و درباره لزوم استفاده از کپسوله سازی در پایتون صحبت کردیم، همچنین با انواع تغییردهنده‌های دسترسی در پایتون آشنا شدیم و درباره هر کدام از آن‌ها همراه با جزییاتشان به طور مجزا با بیان مثال‌های مرتبط صحبت کردیم.

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
codingninjasPYnativegrammar
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *