Ответ
Код соответствует принципам ООП, если в его архитектуре прослеживаются четыре ключевых концепции:
-
Инкапсуляция (Encapsulation)
- Что это? Объединение данных (атрибутов) и методов для их обработки в одном объекте (классе) и сокрытие внутреннего состояния объекта от внешнего мира.
-
Как распознать? Использование классов. Доступ к данным осуществляется через публичные методы (
getters/setters), а сами данные помечены как приватные (например, с префиксами_или__в Python).class BankAccount: def __init__(self, balance): self.__balance = balance # __balance скрыт от прямого доступа def get_balance(self): return self.__balance
-
Наследование (Inheritance)
- Что это? Механизм, позволяющий создавать новый класс (потомок) на основе существующего (родителя), перенимая его атрибуты и методы.
- Как распознать? Класс в своем определении указывает другой класс в скобках. Это устанавливает отношение "является" (
is-a).class Animal: # Родительский класс def move(self): print("Moving...")
class Dog(Animal): # Dog является Animal def bark(self): print("Woof!")
-
Полиморфизм (Polymorphism)
- Что это? Способность объектов с одинаковым интерфейсом (набором методов) иметь разную реализацию этих методов. Позволяет работать с объектами разных классов единообразно.
- Как распознать? Разные классы имеют методы с одинаковым названием, но разным поведением. Код вызывает этот метод, не зная точного типа объекта.
class Cat(Animal): def speak(self): return "Meow"
class Dog(Animal): def speak(self): return "Woof"
Функция работает с любым объектом, у которого есть метод speak()
def print_sound(animal: Animal): print(animal.speak())
print_sound(Cat()) # Выведет "Meow" print_sound(Dog()) # Выведет "Woof"
-
Абстракция (Abstraction)
- Что это? Выделение наиболее значимых характеристик объекта и игнорирование второстепенных. Создание "контракта" или "шаблона" (абстрактного класса), который определяет, что должны делать классы-наследники, но не говорит, как.
- Как распознать? Использование абстрактных классов (в Python — модуль
abc) с абстрактными методами, которые обязательны для реализации в дочерних классах.from abc import ABC, abstractmethod
class Shape(ABC): # Абстрактный класс @abstractmethod def area(self): # Абстрактный метод - "контракт" pass
class Square(Shape): def init(self, side): self.side = side
def area(self): # Реализация контракта return self.side ** 2