Как заставить абстрактный класс наследоваться от другого абстрактного класса в Python?

Возможно ли иметь абстрактный класс, наследуемый от другого абстрактного класса в Python?

Если да, то как мне это сделать?


person Squilliam    schedule 19.01.2018    source источник
comment
stackoverflow.com/questions/48814211/   -  person Jerther    schedule 25.07.2018


Ответы (1)


Взгляните на модуль abc. Для версии 2.7: ссылка. Для версии 3.6: ссылка Простой пример:

from abc import ABC, abstractmethod

class A(ABC):
    def __init__(self, value):
        self.value = value
        super().__init__()

    @abstractmethod
    def do_something(self):
        pass


class B(A):
    @abstractmethod
    def do_something_else(self):
        pass

class C(B):
    def do_something(self):
        pass

    def do_something_else(self):
        pass
person luminousmen    schedule 19.01.2018
comment
ХОРОШО. Моя IDE (PyCharm) жаловалась, что я не предоставил реализации для всех абстрактных методов из класса A в классе B. Я полагаю, что должен просто игнорировать эти предупреждения, или есть какой-то способ заставить его распознать, что класс B является еще одним абстрактным учебный класс? - person Squilliam; 20.01.2018
comment
Вам необходимо предоставить реализации для ВСЕХ абстрактных методов, если вам нужно будет впоследствии создать экземпляр - person luminousmen; 21.01.2018
comment
Да. Мне нужно предоставить реализации для всех абстрактных методов в классе C, поскольку это конкретный класс. Однако я хочу кодировать класс B таким образом, чтобы IDE понимали, что это абстрактный класс (так же, как IDE понимают наследование с интерфейсами в Java). Если это невозможно, я могу просто проигнорировать предупреждение. - person Squilliam; 22.01.2018
comment
Другими словами, моя IDE показывает предупреждение для класса B в вашем коде, но не для класса C. - person Squilliam; 22.01.2018
comment
Не понимаю такого поведения вашей IDE. Я сейчас на VS Code и не вижу никаких предупреждений. Приведенный выше код работает для меня как шарм - person luminousmen; 22.01.2018
comment
Предупреждения пришли бы от pylint или другого линтера. Насколько мне известно, единственный способ избавиться от предупреждения — это скопировать все абстрактные методы для каждого класса, который должен быть абстрактным. Однако, вероятно, лучше просто отключить это конкретное предупреждение. - person amin_nejad; 22.06.2020
comment
Вам не нужно копировать все абстрактные методы для каждого класса, вам просто нужно добавить наследование ABC для всех подклассов, которые должны быть абстрактными, например: класс Foo(ABC), класс Bar(Foo, ABC), класс Baz (Бар) Фу и Бар абстрактны, Баз - нет. - person fuzzKitty; 01.04.2021