Назовите и объясните ключевые принципы ООП в Python

Ответ

Объектно-ориентированное программирование (ООП) в Python строится на четырех основных принципах:

  • 1. Инкапсуляция Сокрытие внутренней реализации объекта и предоставление публичного интерфейса для взаимодействия с ним. Данные (атрибуты) и методы объединяются в класс. В Python инкапсуляция реализуется соглашениями: префикс _ для защищенных членов и __ для приватных (с name mangling).

  • 2. Наследование Механизм, позволяющий создавать новый класс (потомок) на основе существующего (родителя). Потомок перенимает атрибуты и методы родителя, может их расширять или переопределять.

  • 3. Полиморфизм Возможность использовать объекты разных классов с одинаковым интерфейсом. Это позволяет писать более гибкий и обобщенный код. Яркий пример в Python — "утиная типизация" (duck typing): "Если это выглядит как утка и крякает как утка, то это утка".

  • 4. Абстракция Выделение наиболее значимых характеристик объекта и игнорирование второстепенных. В коде это часто реализуется через абстрактные классы (модуль abc), которые определяют общий интерфейс для своих потомков, но не имеют собственной реализации.

Пример, демонстрирующий все принципы:

from abc import ABC, abstractmethod

# 4. Абстракция: определяем общий интерфейс для всех фигур
class Shape(ABC):
    def __init__(self, color):
        # 1. Инкапсуляция: атрибут _color защищен
        self._color = color

    @abstractmethod
    def area(self):
        pass

# 2. Наследование: Circle наследуется от Shape
class Circle(Shape):
    def __init__(self, color, radius):
        super().__init__(color)
        self._radius = radius

    # 3. Полиморфизм: своя реализация метода area
    def area(self):
        return 3.14 * self._radius ** 2

# 2. Наследование: Square наследуется от Shape
class Square(Shape):
    def __init__(self, color, side):
        super().__init__(color)
        self._side = side

    # 3. Полиморфизм: другая реализация метода area
    def area(self):
        return self._side ** 2

# Полиморфизм в действии
shapes = [Circle("Red", 10), Square("Blue", 5)]
for shape in shapes:
    # Вызываем один и тот же метод area для разных объектов
    print(f"Площадь фигуры: {shape.area()}")