如何为该场景下BasicUser的formatterClass参数添加类型提示?
解决BasicUser格式化器参数的类型提示问题
要消除类型检查器的报错,核心是通过**泛型(Generic)**将用户类与对应的格式化器子类绑定,让类型检查器明确每个用户类关联的格式化器具体类型。以下是具体实现方案:
1. 导入必要的类型工具
从typing模块引入泛型相关的类型支持:
from typing import TypeVar, Generic, Type
2. 定义绑定Formatter的类型变量
创建一个类型变量,限定它只能是Formatter或其子类:
TFormatter = TypeVar("TFormatter", bound=Formatter)
3. 将BasicUser改造为泛型类
让BasicUser继承Generic[TFormatter],同时为formatterClass和实例属性formatter添加精确的类型提示:
class BasicUser(Generic[TFormatter]): def __init__(self, formatterClass: Type[TFormatter]): self.formatter: TFormatter = formatterClass() def doThings(self, input): self.formatter.format(input)
4. 子类指定具体的泛型参数
子类继承BasicUser时,明确传入对应的格式化器子类作为泛型参数,同时修正__init__的调用方式(推荐用super()替代直接调用父类构造):
class ValidatorUser(BasicUser[FormatterValidator]): def __init__(self): super().__init__(FormatterValidator) def doStuff(self, input): self.formatter.format(input) def doOtherStuff(self, input): # 修正原代码中错误的val参数为input self.formatter.validate(input) class LoggerUser(BasicUser[FormatterLogger]): def __init__(self): super().__init__(FormatterLogger) def foo(self, input): self.formatter.format(input) # 修正原代码中缺少的方法定义冒号 def bar(self, input): # 修正原代码中错误的val参数为input self.formatter.log(input)
方案说明
泛型TFormatter让BasicUser的每个子类都能绑定特定的格式化器类型,类型检查器可以明确识别:
ValidatorUser的formatter是FormatterValidator实例,因此可以安全调用validate()方法LoggerUser的formatter是FormatterLogger实例,因此可以安全调用log()方法
完整可运行代码
from typing import TypeVar, Generic, Type class Formatter: def format(self, input): ... class FormatterValidator(Formatter): def validate(self, input): ... class FormatterLogger(Formatter): def log(self, input): ... TFormatter = TypeVar("TFormatter", bound=Formatter) class BasicUser(Generic[TFormatter]): def __init__(self, formatterClass: Type[TFormatter]): self.formatter: TFormatter = formatterClass() def doThings(self, input): self.formatter.format(input) class ValidatorUser(BasicUser[FormatterValidator]): def __init__(self): super().__init__(FormatterValidator) def doStuff(self, input): self.formatter.format(input) def doOtherStuff(self, input): self.formatter.validate(input) class LoggerUser(BasicUser[FormatterLogger]): def __init__(self): super().__init__(FormatterLogger) def foo(self, input): self.formatter.format(input) def bar(self, input): self.formatter.log(input)
内容的提问来源于stack exchange,提问作者Primordial_Hamster
相关产品推荐
相关产品推荐

