使用 Mypy 对抽象类进行类型检查时,当子类缺少所需的抽象方法或属性时,不会引发错误。
预期行为:由于
Cat
没有实现 abstractmethod
eat
我希望 mypy 会引发错误。
实际行为:Mypy 对代码本身感到满意,即使在 --strict 下也是如此,并且不会引发错误。
我的环境
from abc import ABCMeta, abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def eat(self, food: str) -> None: pass
class Cat(Animal):
pass
正如 @STerliakov 和 @Barmar 在评论中回答的那样,
mypy
会发现,如果直接实例化(通过 Cat
),Cat()
会缺少所需的抽象方法。
如果您希望
mypy
在声明Cat
时给出错误,您可以将其声明为@final
。然后,mypy
将知道它不可子类化,并在声明时告诉您它必须实现Animal
的所有必需的抽象方法。
至于错误发生在类声明还是实例化哪个好,这个要具体情况而定。如果您正在开发这个包供其他人使用,这可能意味着您永远不会自己实例化
Cat
。如果您在发布包之前运行 mypy
,则在类声明时出现的有关任何缺少抽象方法的错误会阻止您意外向包使用者发布不可实例化的类。