子类方法类型提示不兼容问题求助:如何正确标注类型?
问题分析
报错的核心原因是类型检查器判定子类重写的meth1签名与父类不兼容:
- 父类中
meth1被标注为ClassVar[Callable[[Base], str]],表示这是类级别的可调用对象,接收Base类型实例并返回字符串 - 子类中
meth1是实例方法,self的类型是Subclass(Base的子类)。由于Callable的参数是逆变的——父类的可调用对象能接受所有Base实例,但子类的实例方法仅能接受Subclass实例,因此类型检查器判定签名不匹配。
解决方案
以下两种方法可解决该类型兼容问题:
方法一:使用绑定Base的TypeVar
通过TypeVar定义绑定到Base的类型变量,让父类的Callable参数支持Base及其所有子类,从而匹配子类的实例方法签名:
from typing import ClassVar, Callable, TypeVar # 定义绑定到Base的类型变量 T = TypeVar('T', bound='Base') class Base: def n_a(self: T) -> str: return 'N/A' # 用T作为Callable参数类型,兼容Base及其子类 meth1: ClassVar[Callable[[T], str]] = n_a class Subclass(Base): def meth1(self) -> str: return 'yes'
方法二:使用Self类型(需Python 3.11+或新版类型检查器)
Self类型可表示当前类的实例类型,父类中用Self标注Callable参数,子类的self会自动匹配为Subclass类型:
from typing import ClassVar, Callable, Self class Base: def n_a(self) -> str: return 'N/A' meth1: ClassVar[Callable[[Self], str]] = n_a class Subclass(Base): def meth1(self) -> str: return 'yes'
若使用旧版mypy,需先安装typing-extensions并从其中导入Self:
from typing_extensions import Self
内容的提问来源于stack exchange,提问作者VPfB
相关产品推荐
相关产品推荐

