PyCharm 在有意抽象的子类上“必须实现所有抽象方法”

Mar*_*nen 5 abstract-class abc pycharm python-3.x

我有一个抽象基类,Animal

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

    @abc.abstractmethod
    def eat(self):
        raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)

现在我有另一个 abc 只实现了这些方法之一:

class Bird(Animal):
    def move(self):
        print("fly")
Run Code Online (Sandbox Code Playgroud)

另一个实现缺失方法的类:

class Eagle(Bird):
    def eat(self):
        print("eagle eats")
Run Code Online (Sandbox Code Playgroud)

但是 PyCharm 抱怨Bird它“必须实现所有抽象方法”,而我故意希望它保持抽象。

我错过了什么,还是这是一个错误?如果这只是一个错误,我可以以某种方式忽略警告#noqa吗(类似于)?

gmd*_*mds 5

也只需标记Bird为摘要:

from abc import ABC

class Bird(Animal, ABC):
    def move(self):
        print("fly")
Run Code Online (Sandbox Code Playgroud)

经过一番思考后,实际上,我认为为此目的指定 更有意义metaclass=ABCMeta,就像您最初所做的那样,因为从概念上讲,我们不想修改 的继承层次结构Bird,而是将其标记为抽象类(为了 PyCharm 的利益),也许这是一种更干净的方法。

  • 你是对的,也许将其“重新声明”为 ABC 是件好事,不仅是为了 PyCharm,也是为了我们的清晰。我 100% 同意使用“metaclass”而不是子类化“ABC”,但不幸的是它并没有欺骗 PyCharm,这是我在发布问题之前尝试的第一件事。我不确定为什么子类化“ABC”有效,但重新定义元类却不起作用,但我很高兴你想出了它。 (2认同)