如何基于类属性类型设置Python方法的返回类型提示?
解决方案:使用泛型关联类型
可以通过Python typing 模块的TypeVar和Generic实现,无需在子类中重复重写send方法,让类型系统自动关联子类的reply_type类型。
完整实现代码
from typing import TypeVar, Generic, Type # 定义绑定到BaseReturnType及其子类的类型变量 T = TypeVar('T', bound='BaseReturnType') class BaseReturnType: sender: str = None class BaseMessage(Generic[T]): reply_type: Type[T] = None def send(self) -> T: # 可添加实际发送逻辑,返回reply_type的实例 return self.reply_type() # 实际实现类 class RealReturnType(BaseReturnType): payload: str = None more_payload: str = None class RealMessage(BaseMessage[RealReturnType]): reply_type = RealReturnType # 使用示例 rm = RealMessage() res = rm.send() print(res.more_payload) # 类型检查器会自动识别res为RealReturnType类型
代码说明
- 用
TypeVar('T', bound='BaseReturnType')限制T只能是BaseReturnType或其子类,保证类型安全。 BaseMessage继承Generic[T]成为泛型类,子类可通过指定T的值绑定对应的返回类型。send方法返回类型设为T,reply_type的类型设为Type[T],子类指定T后,send的返回类型会自动匹配reply_type的实例类型。- 子类
RealMessage只需继承BaseMessage[RealReturnType]并赋值reply_type,无需重写send方法。
替代方案:Python 3.11+ 用Self类型
如果使用Python 3.11及以上版本,可尝试Self类型,但部分类型检查器对Self.reply_type的支持尚不完善,泛型方案兼容性更优:
from typing import Type, Self class BaseReturnType: sender: str = None class BaseMessage: reply_type: Type[BaseReturnType] = None def send(self) -> Self.reply_type: return self.reply_type() class RealReturnType(BaseReturnType): payload: str = None more_payload: str = None class RealMessage(BaseMessage): reply_type = RealReturnType
内容的提问来源于stack exchange,提问作者Mario Signorino
相关产品推荐
相关产品推荐

