Ответ
Объектно-ориентированное программирование (ООП) в 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()}")