ООП. Инкапсуляция.

03 января 2020



Инкапсуляция - предотвращает прямой доступ к атрибутам и методам объекта из вызывающего кода.

Инкапсуляция в Python позволяет скрыть атрибуты класса, сделав их приватными или закрытыми, ограничив доступ к ним.

class MyClass:
    __name = "ADMIN"

    def getUser(self):
        return self.__name

    def setUser(self, n):
        self.__name = n
        return self.__name


    def __get2(self):
        return "private data"

    def get3(self):
        return self.__get2()

obj = MyClass()

# print(obj.__name) # ошибка!
print(obj.getUser()) # Отобразить __name
obj.setUser("NewADMIN")
print(obj.getUser()) 

# print(obj.__get2())# ошибка!
print(obj.get3())

В данном примере мы можем получить доступ к __name и __get2 только внутри класса, но за его приделами попытка обращения к ним вызовет ошибку. Данная практика удобна чтобы скрыть внутреннюю логику и защитить атрибуты, которые не должны изменяться. Так же в методе set() можно сделать проверку на правильность ввода.

Аннотации

В Python имеется еще один способ использования инкапсуляции. Этот способ предполагает использование аннотаций начинающихся с символа @ перед написанием метода.

@property - (геттер) переводит метод класса в режим “только для чтения”. Метод get()из предыдущего примера.

@name.setter - (сеттер) позволяем изменять данные в методе name аналог метода set() из предыдущего примера.

class MyClass:
    __nameADMIN = "ADMIN"
    __name = "USER"

    @property
    def newname(self):
        return self.__name

    @newname.setter
    def newname(self, n):
        if n != "NewAdmin"
            return "ERROR!"
        else
            self.__name = n

    @property
    def nameA(self):
        return self.__nameADMIN      

obj = MyClass()

print(obj.nameA)
# obj.nameA = "NEWADMIN" # Вызовет ошибку


print(obj.newname)
obj.newname = "TEST"
print(obj.newname)

Здесь мы определим два атрибута __nameADMINи __name, как и в предыдущем примере, мы не можем изменять их напрямую.

Различия в том что мы можем просматривать методы с аннотацией @property, и изменять методы указанные как setter.