/
mksmakarov
/
learn-python
Обзор
Документация
Войти
/
mksmakarov
/
learn-python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python-lang/object-oriented-programming/code/posibilities_of_abstract_classes.py
120 строк
5 KB
noir3cnt
[ADD] abstract class and interface example
09 июн 2026, 14:08
09 июн 2026, 14:08
ea1b3e0
Код
Авторство
О чём код?
from abc import ABC, abstractmethod, abstractproperty import typing class Vehicle(ABC): """ Абстрактный базовый класс для всех транспортных средств. Демонстрирует полный спектр возможностей ABC в Python. """ # --- 1. Абстрактные методы (Обязательны к реализации) --- @abstractmethod def start_engine(self) -> None: """Абстрактный метод. Каждый транспорт должен уметь заводиться.""" pass @abstractmethod def stop_engine(self) -> None: """Абстрактный метод. Каждый транспорт должен уметь глушить двигатель.""" pass # --- 2. Обычные методы с реализацией (Наследуются как есть) --- def check_fuel_level(self) -> str: """ Обычный метод с реализацией в ABC. Дочерние классы могут его использовать напрямую или переопределить. """ return "Топливный бак полон." # --- 3. Абстрактные свойства (Обязательны к реализации) --- @property @abstractmethod def max_speed(self) -> int: """Абстрактное свойство. У каждого транспорта есть макс. скорость.""" pass # --- 4. Конкретные свойства (@property) --- @property def has_wheels(self) -> bool: """ Свойство с реализацией. По умолчанию считаем, что у транспорта есть колеса, но дочерний класс может это изменить. """ return True # --- 5. Статические методы (Не зависят от экземпляра) --- @staticmethod def get_vehicle_type() -> str: """Статический метод. Общая информация о классе.""" return "Транспортное средство" # --- 6. Методы класса (@classmethod) --- @classmethod def fleet_count(cls) -> int: """ Метод класса. Может быть переопределен в потомках для предоставления специфичной информации. """ print(f"Метод вызван из класса: {cls.__name__}") return 0 # --- 7. Использование Type Hints (аннотаций типов) --- # Этот метод принимает другой объект типа Vehicle и возвращает bool. # Аннотации не являются ограничением на уровне выполнения, # но служат документацией и проверяются статическими анализаторами. def is_faster_than(self, other: 'Vehicle') -> bool: return self.max_speed > other.max_speed # --- Пример реализации дочернего класса --- class Car(Vehicle): """ Конкретный класс, реализующий абстрактный интерфейс Vehicle. Если мы забудем реализовать хотя бы один абстрактный метод/атрибут, Python не позволит создать экземпляр этого класса. """ def __init__(self, model: str): self.model = model # Реализация обязательного абстрактного метода def start_engine(self) -> None: print(f"{self.model}: Р-р-р-р! Двигатель запущен.") # Реализация другого обязательного абстрактного метода def stop_engine(self) -> None: print(f"{self.model}: Двигатель заглушен.") # Реализация обязательного абстрактного свойства @property def max_speed(self) -> int: return 220 # Переопределение обычного метода из ABC def check_fuel_level(self) -> str: base_check = super().check_fuel_level() return f"{base_check} Готов к поездке!" # Переопределение конкретного свойства @property def has_wheels(self) -> bool: return True # У машины точно есть колеса # --- Проверка работы --- if __name__ == "__main__": # Создаем экземпляр Car my_car = Car("Tesla Model S") # Вызов методов my_car.start_engine() # Использует реализацию из Car print(my_car.check_fuel_level()) # Использует переопределенный метод из Car print(f"Макс. скорость: {my_car.max_speed}") # Обращение к свойству print(f"У машины есть колеса? {my_car.has_wheels}") # Обращение к другому свойству # Вызов статического метода print(Vehicle.get_vehicle_type()) # Вызов метода класса print(Car.fleet_count())