Python для новичков: Наследование, инкапсуляция, полиморфизм

Наследование

Наследование — механизм создания новых классов (классов-наследников) на основе существующих (базовых классов). Класс-наследник автоматически получает все поля (атрибуты) и методы базового класса. Пример:

Базовый класс Person с полями name (имя) и age (возраст). Класс-наследник Student, дополнительно содержащий поля course (курс обучения) и gpa (средний балл):

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def set_age(self, age):
        self.age = age

class Student(Person):
    def __init__(self, name, age, course):
        super().__init__(name, age)  # Вызов конструктора базового класса
        self.course = course

igor = Student("Игорь", 19, 1)
print(igor.name) # Выведет "Игорь"
igor.set_age(20) #Используем метод из базового класса
print(igor.age)  # Выведет 20
print(igor.course) # Выведет 1
igor.course = 2 # Изменяем поле класса-наследника
print(igor.course) # Выведет 2

Student наследует метод set_age от Person. Можно добавлять новые поля и методы в класс-наследник, расширяя функциональность базового класса. Это удобно для организации кода, особенно в иерархии классов, например, Person -> Student, Schoolchild, Pensioner.

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

Инкапсуляция — механизм ограничения доступа к полям и методам класса. В Python нет строгих модификаторов доступа (как public, private, protected в других языках). Однако, соглашение о добавлении одного или двух нижних подчеркиваний к имени поля или метода сигнализирует об ограничении доступа.

  • Одно нижнее подчеркивание (_name): Рекомендация не использовать за пределами класса. Доступ все же возможен.
  • Два нижних подчеркивания (__name): Более строгая рекомендация. Python изменяет имя атрибута (name mangling), делая его доступным только изнутри класса.
class Person:
    def __init__(self, name, age):
        self._name = name  # Рекомендация - не использовать снаружи класса
        self.__age = age # Более строгая рекомендация

    def get_age(self):
        return self.__age

_name и __age — поля, к которым рекомендуется не обращаться напрямую извне класса. Для доступа к __age используется метод get_age. Прямой доступ к __age может привести к ошибке.

Полиморфизм

Полиморфизм означает «много форм». Он позволяет использовать один и тот же метод в разных классах с разной реализацией. Пример:

print(1 + 1)  # 2 (сложение чисел)
print("2" + "2")  # 22 (конкатенация строк)

Оператор + выполняет сложение для чисел и конкатенацию для строк. Это полиморфизм — один оператор, разные действия в зависимости от типа данных.

Наследование, инкапсуляция и полиморфизм — фундаментальные концепции объектно-ориентированного программирования. Понимание этих концепций важно для написания эффективного и поддерживаемого кода на Python.

Что будем искать? Например,программа