کپسوله کردن (Encapsulation)

کپسوله کردن (تلفیق داده‌ها با یکدیگر) یا مخفی کردن اطلاعات فرایندی است که طی آن اطللاعات حساس یک موضوع از دید کاربر مخفی می‌شود و فقط اطلاعاتی که لازم باشد برای او نشان داده می‌شود.
وقتی که یک کلاس تعریف می‌کنیم معمولاً تعدادی فیلد برای ذخیره مقادیر مربوط به شیء نیز تعریف می‌کنیم. برخی از این فیلدها توسط خود کلاس برای عملکرد متدها و برخی دیگر از آنها به عنوان یک متغیر موقت به کار می‌روند. به این فیلدها، اعضای مفید نیز می گویند چون فقط در عملکرد متدها تأثیر دارند و مانند یک داده قابل رویت کلاس نیستند. لازم نیست که کاربر به تمام فیلدها یا متدهای کلاس دسترسی داشته باشد. اینکه فیلدها را طوری تعریف کنیم که در خارج از کلاس قابل دسترسی باشند بسیار خطرناک است چون ممکن است کاربر رفتار و نتیجه یک متد را تغییر دهد. به برنامه ساده زیر توجه کنید :

 1: class Test:
 2:     five = 5;
 3:     def AddFive(self, number):
 4:         number =  number + self.five;
 5:         return number;
 6: 
 7: x = Test();
 8: x.five = 10;
 9: print(x.AddFive(100));
110

متد داخل کلاس Test به نام AddFive دارای هدف ساده‌ای است و آن اضافه کردن مقدار 5 به هر عدد می‌باشد. در خط 7 یک نمونه از کلاس Test ایجاد کرده‌ایم و مقدار فیلد آن را از 5 به 10 تغییر می‌دهیم (در اصل نباید تغییر کند چون ما از برنامه خواسته‌ایم هر عدد را با 5 جمع کند ولی کاربر به راحتی آن را به 10 تغییر می‌دهد). همچنین متد AddFive() را فراخوانی و مقدار 100 را به آن ارسال می‌کنیم (خط 9). مشاهده می‌کنید که قابلیت متد AddFive() به خوبی تغییر می‌کند و شما نتیجه متفاوتی مشاهده می‌کنید. اینجاست که اهمیت کپسوله سازی مشخص می‌شود. اینکه ما در درسهای قبلی فیلدها را به صورت public تعریف کردیم و به کاربر اجازه دادیم که در خارج از کلاس به آنها دسترسی داشته باشد کار اشتباهی بود. فیلدها باید همیشه به صورت private تعریف شوند.