Инкапсуляция — это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет скрывать внутреннюю реализацию объекта и предоставлять контролируемый доступ к его данным. В Python инкапсуляция реализуется с помощью механизмов, таких как приватные атрибуты и методы, а также свойства (properties).
В Python для обозначения приватных атрибутов и методов используется префикс из двух символов подчеркивания __. Такие атрибуты и методы не могут быть доступны напрямую извне класса.
class BankAccount:
def __init__(self, balance):
self.__balance = balance # Приватный атрибут
def deposit(self, amount):
self.__balance += amount
def get_balance(self):
return self.__balance
account = BankAccount(1000)
print(account.get_balance()) # Вывод: 1000
account.deposit(500)
print(account.get_balance()) # Вывод: 1500
# Попытка доступа к приватному атрибуту напрямую
print(account.__balance) # Ошибка: AttributeError
Здесь __balance — приватный атрибут, который нельзя изменить или прочитать напрямую. Для доступа к нему используются публичные методы deposit и get_balance.
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def __update_balance(self, amount): # Приватный метод
self.__balance += amount
def deposit(self, amount):
self.__update_balance(amount)
account = BankAccount(1000)
account.deposit(500)
# Попытка вызова приватного метода напрямую
account.__update_balance(100) # Ошибка: AttributeError
Здесь __update_balance — приватный метод, который может быть вызван только внутри класса.
Свойства позволяют контролировать доступ к атрибутам класса, добавляя логику при чтении, записи или удалении значения. Для этого используются декораторы @property, @<attribute>.setter и @<attribute>.deleter.
class BankAccount:
def __init__(self, balance):
self.__balance = balance
@property
def balance(self): # Геттер
return self.__balance
@balance.setter
def balance(self, value): # Сеттер
if value < 0:
raise ValueError("Баланс не может быть отрицательным")
self.__balance = value
account = BankAccount(1000)
print(account.balance) # Вывод: 1000 (используется геттер)
account.balance = 1500 # Используется сеттер
print(account.balance) # Вывод: 1500
# Попытка установить отрицательный баланс
account.balance = -100 # Ошибка: ValueError
Здесь:
@property определяет геттер для атрибута balance.@balance.setter определяет сеттер, который проверяет, что баланс не может быть отрицательным.Атрибуты и методы с одним символом подчеркивания _ считаются "защищенными" (protected). Они не являются приватными в строгом смысле, но по соглашению указывают, что эти элементы не предназначены для использования вне класса или его подклассов.
class BankAccount:
def __init__(self, balance):
self._balance = balance # Защищенный атрибут
def get_balance(self):
return self._balance
account = BankAccount(1000)
print(account.get_balance()) # Вывод: 1000
print(account._balance) # Доступ возможен, но не рекомендуется
Здесь _balance — защищенный атрибут, который можно использовать, но это не рекомендуется.
Инкапсуляция в Python реализуется с помощью:
__), которые недоступны напрямую извне класса._), которые по соглашению не предназначены для внешнего использования.Использование этих механизмов помогает создавать более безопасные и поддерживаемые классы, скрывая внутреннюю реализацию и предоставляя контролируемый доступ к данным.