You are currently viewing Инкапсуляция в Python

Инкапсуляция в Python

Инкапсуляция — одна из фундаментальных концепций объектно-ориентированного программирования (ООП). В нем описывается идея упаковки данных и методы, которые работают с данными в рамках одного блока. Это накладывает ограничения на прямой доступ к переменным и методам и может предотвратить случайное изменение данных. Чтобы предотвратить случайное изменение, переменная объекта может быть изменена только методом объекта. Эти типы переменных известны как частные переменные.
Класс является примером инкапсуляции, поскольку он инкапсулирует все данные, которые являются функциями-членами, переменными и т. д.

Рассмотрим реальный пример инкапсуляции: в компании существуют различные разделы, такие как раздел счетов, раздел финансов, раздел продаж и т. д. Финансовый раздел обрабатывает все финансовые операции и ведет учет всех данных, связанных с финансами. Аналогичным образом, отдел продаж обрабатывает все действия, связанные с продажами, и ведет учет всех продаж. Сейчас может возникнуть ситуация, когда по какой-то причине чиновнику из финансового отдела нужны все данные о продажах за конкретный месяц. В этом случае ему не разрешается прямой доступ к данным раздела продаж. Сначала ему придется связаться с каким-нибудь другим сотрудником отдела продаж, а затем попросить его предоставить конкретные данные. Вот что такое инкапсуляция. Здесь данные отдела продаж и сотрудники, которые могут ими манипулировать, объединены под одним названием “отдел продаж”. Использование инкапсуляции также скрывает данные. В этом примере данные таких разделов, как продажи, финансы или счета, скрыты от любого другого раздела.

Защищенные члены

Защищенные члены (в C++ и JAVA) — это те члены класса, доступ к которым невозможен вне класса, но к которым можно получить доступ внутри класса и его подклассов. Чтобы выполнить это в Python, просто следуйте соглашению, добавляя имя участника с помощью одного символа подчеркивания “_”.
Примечание: Метод __init__ является конструктором и запускается, как только создается экземпляр объекта класса.

# Python program to
# demonstrate protected members


# Creating a base class
class Base:
	def __init__(self):
		
		# Protected member
		self._a = 2

# Creating a derived class
class Derived(Base):
	def __init__(self):
		
		# Calling constructor of
		# Base class
		Base.__init__(self)
		print("Calling protected member of base class: ")
		print(self._a)

obj1 = Derived()
		
obj2 = Base()

# Calling protected member
# Outside class will result in
# AttributeError
print(obj2.a)

Выход:

Calling protected member of base class: 
2
Traceback (most recent call last):
 File "/home/6fb1b95dfba0e198298f9dd02469eb4a.py", line 25, in 
 print(obj1.a)
AttributeError: 'Base' object has no attribute 'a'

Частные участники

Закрытые члены похожи на защищенные члены, разница в том, что члены класса, объявленные закрытыми, не должны быть доступны ни за пределами класса, ни каким-либо базовым классом. В Python не существует Частное переменные экземпляра, доступ к которым возможен только внутри класса. Однако для определения частного участника префикс имени участника с двойным подчеркиванием “__”.
 

Примечание: К закрытому и защищенному члену Python можно получить доступ за пределами класса через искажение имени python.

# Python program to
# demonstrate private members

# Creating a Base class
class Base:
	def __init__(self):
		self.a = "ProgramBox"
		self.__c = "ProgramBox"

# Creating a derived class
class Derived(Base):
	def __init__(self):
		
		# Calling constructor of
		# Base class
		Base.__init__(self)
		print("Calling private member of base class: ")
		print(self.__c)
# Driver code
obj1 = Base()
print(obj1.a)

# Uncommenting print(obj1.c) will
# raise an AttributeError

# Uncommenting obj2 = Derived() will
# also raise an AtrributeError as
# private member of base class
# is called inside derived class

Выход:

ProgramBox
Traceback (most recent call last):
  File "/home/f4905b43bfcf29567e360c709d3c52bd.py", line 25, in <module>
    print(obj1.c)
AttributeError: 'Base' object has no attribute 'c'

Traceback (most recent call last):
  File "/home/4d97a4efe3ea68e55f48f1e7c7ed39cf.py", line 27, in <module>
    obj2 = Derived()
  File "/home/4d97a4efe3ea68e55f48f1e7c7ed39cf.py", line 20, in __init__
    print(self.__c)
AttributeError: 'Derived' object has no attribute '_Derived__c'