You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:子类未实现抽象方法时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:48:25