Инкапсуляция, атрибуты и свойства
@ProgHelpBotИнкапсуляция
Предотвращает прямой доступ к атрибутам объект из вызывающего кода. Можно скрыть атрибуты класса сделав их приватными или закрытыми и ограничив доступ к ним через специальные методы, которые еще называются свойствами.
self.__[приватный атрибут] = [значение]
Пример:
class Person:
def __init__(self, name):
self.__name = name
self.__age = 0
def get_age(self): # геттер (аксессор)
return self.__age
def set_age(self, age): # сеттер (мьютейтор)
if 0 <= age <= 100:
self.__age = age
else:
print("Error")
def get_name(self): # геттер
return self.__name
alex = Person("Alex")
alex.set_age(-5) # Error
alex.set_age(18)
print(alex.get_name(), alex.get_age()) # Alex 18
Аннотации свойств
Имеется еще один способ определения свойств.
Создание геттера:
@property def [свойство](self, [параметры]): [инструкции]
Создание сеттера:
@[свойство].setter def [свойство](self, [параметры]): [инструкции]
Сеттер определяется после геттера. После определения геттера и сеттера обращение к атрибутам класса происходит следующим образом:
[объект].[атрибут]
Пример:
class Person:
def __init__(self, name):
self.__name = name
self.__age = 0
@property
def age(self): # геттер
return self.__age
@age.setter
def age(self, age): # сеттер
if 0 <= age <= 100:
self.__age = age
else:
print("Error")
@property
def name(self): # геттер
return self.__name
alex = Person("Alex")
alex.age = -5 # Error
alex.age = 18
print(alex.name, alex.age) # Alex 18