(Инкапсуляция)
В ЯП python по умолчанию все атрибуты в классах являются общедоступными(public), это значит , что из любого места программы мы можем получить аттрибут объекта и изменть его.
🎯Пример:
class Human: def __init__(self, name, age): #коструктор класса Human self.name = name #устанавливаем имя self.age = age #устанавливаем возраст def display_info(self): print ("Имя : ", self.name, "\tВозраст:", self.age)Me = Human ("python_lounge", 2)Me.name = "Captain-America!" # изменяем атрибут nameMe.age = 132 # изменяем атрибут ageMe.display_info() ✅Результат:
Output : "Имя: Человек-паук Возраст: -129"В примере выше мы показали что без икапсуляции можно нежелательным образом изменять аттрибуты класса.
Не зря инкапсуляция является несущим звеном в мире ООП.
⚠️
На вопрос что такое инкапсуляция в программировании нужно ответить следующим образом.
Инкапсуляция предотвращает прямой доступ к атрибутам объект из вызывающего кода.
Касательно инкапсуляции непосредственно в языке программирования Python, скрыть атрибуты класса можно сделав их приватными или закрытыми и ограничив доступ к ним через специальные методы, которые еще называются свойствами.
Изменим выше определенный класс, определив в нем свойства:
class Human: def __init__(self, name, age): #коструктор класса Human self.__name = name #устанавливаем имя self.__age = age #устанавливаем возраст def set_age(self, age): if (age in range(1,100)): self.__age = age # else : print ("Недопустимый возраст") def set_name (self, name): self.__name = name if name else print ("Недопустимое имя") def display_info(self): print ("Имя : ", self.__name, "\tВозраст:", self.__age) def get_age(self): return self.__age def get_name(self): return self.__nameMe = Human ("python_lounge", 2)Me.display_info() #Имя:python_lounge Возраст: 2Me.set_name ("Captain-America!") #изменяем атрибут nameMe.set_age(26) # изменяем атрибут ageMe.display_info() #Имя:Captain-America! Возраст: 26Для создания приватного атрибута в начале его наименования ставится двойной прочерк:
self.__name. К такому атрибуту мы сможем обратиться только из того же класса. Но не сможем обратиться вне этого класса. Например, присвоение значения этому атрибуту ничего не даст:Me.__age = 43👉Аннотации свойств
Выше мы рассмотрели, как создавать свойства. Но Python имеет также еще один - более элегантный способ определения свойств. Этот способ предполагает использование аннотаций, которые предваряются символом @.
Для создания свойства-геттера над свойством ставится аннотация
@property.Для создания свойства-сеттера над свойством устанавливается аннотация имя_свойства_геттера.setter.