В языке Python есть еще один распространенный способ объявления абстрактных методов класса через декоратор abstractmethod модуля abc:
from abc import ABC, abstractmethod
Чтобы корректно работал декоратор abstractmethod сам класс должен наследоваться от базового класса ABC. Например, так:
class Transport(ABC):
@abstractmethod
def go(self):
"""Метод для перемещения транспортного средства"""
@classmethod
@abstractmethod
def abstract_class_method(cls):
"""Абстрактный метод класса"""
Мы здесь имеем два абстрактных метода внутри класса Transport, причем, первый метод go() - это обычный метод, а второй abstract_class_method() - это абстрактный метод уровня класса. Обратите внимание на порядок использования декораторов classmethod и abstractmethod. Они должны быть записаны именно в такой последовательности.
Теперь, если объявить какой-либо дочерний класс, например:
class Bus(Transport):
def __init__(self, model, speed):
self._model = model
self._speed = speed
def go(self):
print("bus go")
@classmethod
def abstract_class_method(cls):
pass
То в нем обязательно нужно переопределить абстрактные методы go и abstract_class_method класса Transport. Иначе, объект класса Bus не будет создан (возникнет исключение TypeError).
Также с помощью модуля abc можно определять не только абстрактные методы, но и абстрактные объекты-свойства (property). Делается это следующим образом:
from abc import ABC, abstractmethod
class Transport(ABC):
@abstractmethod
def go(self):
"""Метод для перемещения транспортного средства"""
@property
@abstractmethod
def speed(self):
"""Абстрактный объект-свойство getter 'speed' """
@speed.setter
@abstractmethod
def speed(self, value):
"""Абстрактный объект-свойство setter 'speed' """
Порядок навешивания декораторов важен! Конечно, вы можете в базовом классе Transport не прописывать "property", и без этого сработает. Но так лучше все-таки делать, чтобы понимать как именно надо реализовывать этот метод в дочернем классе.
Комментарии и реакции приветствуются👇
🔥 — Огонь, приму на вооружение!
🤔 — Знал, но освежил память.
💬 — Есть вопросы в комментарии!