Ответ
Основные принципы объектно-ориентированного программирования (ООП) направлены на создание модульного, гибкого и поддерживаемого кода. Их четыре:
-
Инкапсуляция (Encapsulation) Объединение данных (атрибутов) и методов для их обработки в единый объект (класс) с сокрытием деталей реализации. Это защищает данные от прямого неконтролируемого доступа и упрощает интерфейс объекта.
Почему это важно? Позволяет изменять внутреннюю логику объекта, не затрагивая код, который его использует.
class BankAccount: def __init__(self, initial_balance): # __balance является "приватным" атрибутом self.__balance = initial_balance def deposit(self, amount): if amount > 0: self.__balance += amount def get_balance(self): return self.__balance
-
Наследование (Inheritance) Механизм, позволяющий создавать новый класс (потомок) на основе существующего (родителя), заимствуя его атрибуты и методы. Это способствует повторному использованию кода и построению иерархии классов.
Почему это важно? Устраняет дублирование кода и организует классы по принципу "is-a" (является).
class Animal: def speak(self): raise NotImplementedError("Subclass must implement abstract method") class Dog(Animal): # Dog наследует от Animal def speak(self): return "Woof!"
-
Полиморфизм (Polymorphism) Способность объектов разных классов отвечать на один и тот же вызов метода по-разному. Позволяет использовать единый интерфейс для работы с объектами разных типов.
Почему это важно? Делает систему более гибкой и расширяемой. Можно добавлять новые классы без изменения кода, который их использует.
class Cat(Animal): def speak(self): return "Meow!" # Функция работает с любым потомком Animal def make_animal_sound(animal: Animal): print(animal.speak()) make_animal_sound(Dog()) # Выведет "Woof!" make_animal_sound(Cat()) # Выведет "Meow!"
-
Абстракция (Abstraction) Выделение наиболее значимых характеристик объекта и игнорирование второстепенных. В программировании это реализуется через создание простых интерфейсов для сложных систем, скрывая детали их реализации.
Почему это важно? Снижает сложность системы, позволяя разработчикам фокусироваться на взаимодействии объектов, а не на их внутреннем устройстве.