Абстрактный класс, повторное наследование, конкретный пример

#python-3.x #abstract-class #multiple-inheritance #abc

#python-3.x #абстрактный класс #множественное наследование #abc

Вопрос:

Я работаю над кодовой базой, которую я не полностью освоил (пока). У меня есть следующая структура из 3 классов:

 class Processor(ABC):
    @abstractmethod
    def process(self, *args: Any, **kwargs: Any):
        pass


class AbstractEsTask(Processor, ABC):
    def calculate(self, param):
         ...


@DplTask
class EsDirectTask(AbstractEsTask):
    def process(self):
        return self.calculate(param = "DIRECT")
  

Мне кажется, что AbstractEsTask наследовать от ABC излишне, поскольку Processor уже есть.

Я попытался соответствующим образом отредактировать код ( class AbstractEsTask(Processor, ABC) -> class AbstractEsTask(Processor) ) и не смог заметить никаких изменений в выходных данных. Но, поскольку это большая кодовая база, этого, вероятно, недостаточно. Правильно ли я понимаю (выделено жирным шрифтом выше)?

Ответ №1:

Ваше утверждение верно, потому что при AbstractEsTask наследовании Processor оно будет иметь доступ ко всем значениям ABC .

Или, другими словами, если python не может найти метод в AbstractEsTask , он сначала будет искать в Processor, а затем ABC . Поскольку Processor имеет все элементы, которые ABC есть, ABC никогда не понадобятся. Если элемент не найден в Processor , он не будет найден в ABC .

Я не могу придумать ни одного крайнего случая, когда было бы необходимо двойное наследование, подобное тому, которое вы описали выше. Даже если Processor изменяется один из методов ABC , наследование не будет затронуто, потому что Processor наследуется первым.

Это описано в документах Python