为什么mypy未对实例化含未实现纯虚方法的类发出警告?
mypy未触发告警的原因
- 你所定义的
Father类并不是Python规范中的抽象类:Python要实现带纯虚方法的抽象类,必须同时满足继承abc.ABC基类、为抽象方法添加@abstractmethod装饰器两个要求。你当前代码里的run只是普通的空实现方法,并非强制要求子类重写的抽象方法,Son类不重写该方法不属于语法错误。 - mypy的默认配置规则不校验普通子类是否覆盖父类的普通方法:只有当你按规范定义抽象类之后,mypy才会在你实例化未实现全部抽象方法的子类时抛出错误。
- 宽松配置下的类型校验遗漏:你当前
run方法声明返回值为int,但实际空实现pass等价于返回None,默认未开启严格模式的mypy也不会对这类返回值不匹配的问题抛出告警。
如果需要mypy正确检测到该问题,可按标准抽象类规则改造代码,示例如下:
from abc import ABC, abstractmethod class Father(ABC): def __init__(self): self.i = 800 @abstractmethod def run(self, s: str) -> int: pass class Son(Father): def walk(self, i: int) -> int: return self.i + i + 800 # 此时实例化Son时mypy会抛出错误:Cannot instantiate abstract class "Son" with abstract attribute "run" s = Son()
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

