咨询:子类未实现抽象方法时Mypy未报错的问题
问题解决:Mypy未检测到抽象子类缺失实现的抽象方法
问题原因
Mypy默认不会对未被实例化、也未标记为最终类的抽象子类做强制检查,因为它无法判断这个子类是否本身就是抽象类(即使你没有显式用ABCMeta或@abstractmethod标记)。这种设计是为了避免误判那些用来被继承的中间子类。
解决方法
方法1:实例化子类
只要你尝试创建Cat的实例,Mypy就会立刻检测到错误:
from abc import ABCMeta, abstractmethod class Animal(metaclass=ABCMeta): @abstractmethod def eat(self, food: str) -> None: pass class Cat(Animal): pass cat = Cat() # Mypy报错:Cannot instantiate abstract class "Cat" with abstract method "eat"
方法2:用@final标记子类
通过@final装饰器告诉Mypy,这个类是最终类、不能被继承,必须实现所有抽象方法:
from abc import ABCMeta, abstractmethod from typing import final class Animal(metaclass=ABCMeta): @abstractmethod def eat(self, food: str) -> None: pass @final class Cat(Animal): # Mypy报错:Final class "Cat" has abstract attributes "eat" pass
方法3:显式将子类作为具体类型使用
如果不想实例化或标记final,可以通过类型标注让Mypy明确这个类是用来创建实例的具体类型:
from abc import ABCMeta, abstractmethod from typing import Type class Animal(metaclass=ABCMeta): @abstractmethod def eat(self, food: str) -> None: pass class Cat(Animal): pass def create_animal(cls: Type[Animal]) -> Animal: return cls() create_animal(Cat) # Mypy报错:Argument 1 to "create_animal" has incompatible type "Type[Cat]"; expected "Type[Animal]"
补充说明
即使开启--strict模式,Mypy也不会主动检查未被使用的抽象子类——这是设计逻辑,而非bug,目的是兼容那些本身作为抽象父类的子类场景。
内容的提问来源于stack exchange,提问作者Tharuka Devendra
相关产品推荐
相关产品推荐

