Инкапсуляция — это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет скрывать внутреннюю реализацию объекта и предоставлять контролируемый доступ к его данным. В 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 реализуется с помощью:
__
), которые недоступны напрямую извне класса._
), которые по соглашению не предназначены для внешнего использования.Использование этих механизмов помогает создавать более безопасные и поддерживаемые классы, скрывая внутреннюю реализацию и предоставляя контролируемый доступ к данным.