Инкапсуляция
Изучите продвинутые концепции ООП.
«Инкапсуляция» — бесплатный урок Python For Kids на CoddyKit. Это урок 4 из 5. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python For Kids, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python For Kids содержит 5 уроков всего.
Инкапсуляция
С возвращением на урок по объектно-ориентированному программированию (ООП)! Сегодня Вы узнаете об инкапсуляции в Python — важном понятии, которое помогает защищать данные и методы внутри классов.

Что такое инкапсуляция?
Инкапсуляция — это объединение данных (attributes) и методов (функций), работающих с этими данными, в едином объекте, называемом классом. Она также ограничивает прямой доступ к некоторым компонентам объекта, скрывая его внутреннее представление от внешнего кода.
- Сокрытие данных: Защита внутреннего состояния объекта от непреднамеренного вмешательства.
- Контроль доступа: Определение способов доступа к данным и методам и их изменения.
Инкапсуляция позволяет объектам самостоятельно управлять своими данными и предоставлять только необходимую информацию.
Модификаторы доступа
В Python инкапсуляция реализуется с помощью модификаторов доступа, которые управляют видимостью членов класса (attributes и методов). Существует три типа модификаторов доступа:
- Открытые: Доступны откуда угодно.
- Защищённые: Доступны внутри класса и его дочерних классов.
- Закрытые: Доступны только внутри самого класса.
Давайте посмотрим, как использовать эти модификаторы доступа в Python.
Открытые attributes и методы
Открытые члены доступны за пределами класса. По умолчанию все attributes и методы являются открытыми, если не указано иное.
Пример:
# Defines the Person class with public attributes and methods
class Person:
def __init__(self, name, age):
self.name = name # Public attribute
self.age = age # Public attribute
def greet(self):
print("Hello, my name is " + self.name + "!") # Public method
# Creates an object of the Person class
person1 = Person("Alice", 30)
# Accesses public attributes and methods
print(person1.name) # Output: Alice
person1.greet() # Output: Hello, my name is Alice!
Защищённые attributes и методы
Защищённые члены обозначаются префиксом из одного символа подчёркивания (_). Они доступны внутри класса и его дочерних классов, но к ним не следует обращаться напрямую из-за пределов класса.
Пример:
# Defines the Employee class with protected attributes and methods
class Employee:
def __init__(self, name, salary):
self._name = name # Protected attribute
self._salary = salary # Protected attribute
def _increase_salary(self, amount):
self._salary += amount # Protected method
print(self._name + "'s new salary is " + str(self._salary))
# Creates an object of the Employee class
employee1 = Employee("Bob", 50000)
# Accesses protected attributes and methods (not recommended)
print(employee1._name) # Output: Bob
employee1._increase_salary(5000) # Output: Bob's new salary is 55000
Закрытые attributes и методы
Закрытые члены обозначаются префиксом из двух символов подчёркивания (__). Они доступны только внутри самого класса, и к ним нельзя обращаться напрямую из-за его пределов.
Пример:
# Defines the BankAccount class with private attributes and methods
class BankAccount:
def __init__(self, owner, balance):
self.__owner = owner # Private attribute
self.__balance = balance # Private attribute
def deposit(self, amount):
self.__balance += amount # Modifies private attribute
print("Deposited:", amount)
self.__show_balance()
def __show_balance(self):
print("Current Balance:", self.__balance) # Private method
# Creates an object of the BankAccount class
account1 = BankAccount("Charlie", 1000)
# Attempts to access private attributes and methods (will cause errors)
# print(account1.__owner) # AttributeError
# account1.__show_balance() # AttributeError
# Uses public methods to interact with private attributes
account1.deposit(500) # Output:
# Deposited: 500
# Current Balance: 1500
Зачем нужна инкапсуляция?
Инкапсуляция даёт несколько преимуществ:
- Контроль: Контроль доступа к данным и их изменения.
- Безопасность: Защита внутреннего состояния объекта от непреднамеренных изменений.
- Удобство сопровождения: Код проще поддерживать, и он менее подвержен ошибкам.
Инкапсуляция помогает создавать надёжные и безопасные приложения.
Пример инкапсуляции: класс Car
Создадим класс Car, использующий инкапсуляцию для защиты своих атрибутов и методов.
Код:
# Defines the Car class with encapsulated attributes and methods
class Car:
def __init__(self, make, model, year):
self.make = make # Public attribute
self.model = model # Public attribute
self.__year = year # Private attribute
def get_year(self):
return self.__year # Public method to access private attribute
def set_year(self, year):
if year > 0:
self.__year = year # Public method to modify private attribute
print("Year updated to", self.__year)
else:
print("Invalid year!")
def __display_info(self):
print(self.make, self.model, self.__year) # Private method
def show_info(self):
self.__display_info() # Public method that calls a private method
# Creates an object of the Car class
car1 = Car("Tesla", "Model S", 2020)
# Accesses public attributes and methods
print(car1.make) # Output: Tesla
print(car1.get_year()) # Output: 2020
# Modifies the private attribute using a public method
car1.set_year(2021) # Output: Year updated to 2021
# Calls a public method that interacts with a private method
car1.show_info() # Output: Tesla Model S 2021
# Attempts to access private attributes and methods directly (will cause errors)
# print(car1.__year) # AttributeError
# car1.__display_info() # AttributeError
# Defines the Student class with encapsulated attributes
class Student:
def __init__(self, name, grade):
self.name = name # Public attribute
self.__grade = grade # Private attribute
def get_grade(self):
return self.__grade # Public method to access private attribute
def set_grade(self, grade):
if 0 <= grade <= 100:
self.__grade = grade # Updates the grade
else:
print("Invalid grade!")
# Creates an object of the Student class
student1 = Student("Diana", 85)
# Accesses and modifies the grade using public methods
print(student1.get_grade()) # Output: 85
student1.set_grade(90)
print(student1.get_grade()) # Output: 90
# Attempts to access the private attribute directly (will cause an error)
# print(student1.__grade) # AttributeError
Отличная работа!
Вы научились использовать инкапсуляцию в Python для защиты данных и методов внутри классов. Инкапсуляция помогает контролировать доступ к данным объекта, делая программы более безопасными и удобными для сопровождения. Продолжайте практиковаться: создавайте классы с подходящими модификаторами доступа, чтобы совершенствовать свои навыки программирования!

Часто задаваемые вопросы
Урок «Инкапсуляция» бесплатный?
Да — полный текст урока «Инкапсуляция» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python For Kids, подпишись на CoddyKit PRO. Курс Python For Kids содержит 5 уроков всего.
Чему я научусь в уроке «Инкапсуляция»?
Изучите продвинутые концепции ООП. Ты практикуешь Python For Kids с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python For Kids?
Предыдущий опыт не требуется. Python For Kids на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 5.
Сколько времени занимает урок «Инкапсуляция»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python For Kids?
Да. Каждый урок Python For Kids включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.