Python如何实现可继承的自定义类构造器(类方法)?
问题原因
你写法的核心错误是混淆了类型标注对象和实际运行时对象:Type[T]是用来给cls做类型标注的语法,本身不能作为构造器调用。类方法的第一个参数cls就代表当前发起调用的类(父类调用时是Parent,子类调用时是Child),直接用它来实例化即可。
修正后完整代码
from dataclasses import dataclass from typing import Type, TypeVar # 给TypeVar加上绑定约束,明确T只能是Parent及其子类的类型 T = TypeVar("T", bound="Parent") @dataclass class Parent: something: int = 2 @classmethod def from_float(cls: Type[T], something_as_float: float) -> T: # 直接用cls实例化,运行时cls就是调用该方法的类 return cls(something=int(something_as_float)) @dataclass class Child(Parent): """ 可以正常继承from_float构造方法 """ assert isinstance(Parent.from_float(1.0), Parent) assert isinstance(Child.from_float(1.0), Child)
验证说明
上述代码可正常通过mypy类型检查,运行时两个断言也会全部通过,完美满足可继承自定义构造器的需求。
内容的提问来源于stack exchange,提问作者Andrew Wagner
相关产品推荐
相关产品推荐

