PyCharm «должен реализовывать все абстрактные методы» в подклассе, который является намеренно абстрактным - PullRequest
1 голос
/ 20 мая 2019

У меня есть абстрактный базовый класс, Animal:

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def move(self):
        raise NotImplementedError()

    @abc.abstractmethod
    def eat(self):
        raise NotImplementedError()

Теперь у меня есть другой abc, который реализует только один из этих методов:

class Bird(Animal):
    def move(self):
        print("fly")

Другой класс, который реализует отсутствующий метод:

class Eagle(Bird):
    def eat(self):
        print("eagle eats")

Но PyCharm жалуется на Bird, что он "должен реализовывать все абстрактные методы", когда я намеренно хочу, чтобы он оставался абстрактным.

Я что-то упустил, или это ошибка? Если это просто ошибка, могу ли я как-то проигнорировать предупреждение (аналогично #noqa)?

1 Ответ

1 голос
/ 20 мая 2019

Просто отметьте Bird как абстрактный:

from abc import ABC

class Bird(Animal, ABC):
    def move(self):
        print("fly")

Подумав немного об этом, на самом деле, я думаю, что для этой цели было бы более целесообразно указать metaclass=ABCMeta, как вы делали это изначально, поскольку концептуально мы не хотим изменять иерархию наследования Bird, но скорее пометьте его как абстрактный класс (для выгоды PyCharm), и, возможно, это более чистый способ сделать это.

...