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

ویژگی‌های خصوصی ویژگی‌های غیرقابل دسترسی هستند و ما از دو underscore  (__) برای اعلام ویژگی های خصوصی استفاده می کنیم.

مثال قبلی را در نظر بگیرید. فرض کنید می خواهیم در کلاس Person متدی داشته باشیم که تعداد ساعت اضافه کار کارمند در یک ماه را بگیرد و اضافه حقوق این ماه او را به ما بدهد. ابتدا لازم است یک ویژگی خصوص در __init__ اضافه کنیم که دستمزد اضافه کاری به ازای هر یک ساعت را در آن ذخیره کنیم:

def __init__(self, first_name, last_name, IDnumber ):
    self.firstname=first_name
    self.lastname=last_name
    self.ID=IDnumber
    self.salary = None
    self.__extraperhour=500000

همچنین باید یک متد به کلاس اضافه کنیم که تعداد ساعت اضافه کار را بگیرد و اضافه حقوق را محاسبه نماید و برگرداند:

def get_extra(self, extra_hours):
    return extra_hours * (self.__extraperhour)

کلاس را به طور کامل می توانید در زیر مشاهده کنید:

class Person:
    def __init__(self, first_name, last_name, IDnumber ):
        self.firstname=first_name
        self.lastname=last_name
        self.ID=IDnumber
        self.salary = None
        self.__extraperhour=500000

    def set_salary(self, salary):
        self.salary = salary

    def get_extra(self, extra_hours):
        return extra_hours * (self.__extraperhour)

حالا یک عضو تعیین می کنیم و سپس مقدار اضافه حقوق او را دریافت می نماییم:

kamran=Person('Kamran' , 'Hamidi' , '1257148')
print(kamran.get_extra(9))

با توجه به اینکه دستمزد یک ساعت اضافه حقوق را از طریق self.__extraperhour معادل 500000 ریال تعریف کرده بودیم، این کارمند به ازای 9 ساعت اضافه کار مبلغ 4500000 ریال اضافه حقوق دریافت خواهد کرد.

حالا اگر تلاش کنید که با دستور زیر دستمزد یک ساعت اضافه کار را استخراج کنید:

print(kamran.__extraperhour)

با این خطا مواجه خواهید شد:

AttributeError: ‘Person’ object has no attribute ‘__extraperhour’

اما شاید بعدا بخواهیم با توجه به شرایط حقوق یک ساعت اضافه کار این کارمند را تغییر دهیم. بنابراین می توانیم برای تعیین مقدار __extraperhour  نیز تابعی در بدنه کلاس بنویسیم:

def set_perhour(self, perhour):
    self.__extraperhour=perhour

حالا با اجرای دستور زیر دستمزد یک ساعت اضافه کار شخص به 550000 ریال تغییر می کند:

kamran.set_perhour(550000)

و با اجرای دستور زیر اضافه کار یک ماه او معادل 4950000 ریال محاسبه خواهد شد:

print(kamran.get_extra(9))

در مطلب بعدی به مبحث وراثت یا ارث بری خواهیم پرداخت.