假设我有两个类Base
,并且Child
在Base
. 工厂方法调用另一个可能被Base
的子类覆盖的类方法。
class Base(object):
@classmethod
def create(cls, *args: Tuple) -> 'Base':
value = cls._prepare(*args)
return cls(value)
@classmethod
def _prepare(cls, *args: Tuple) -> Any:
return args[0] if args else None
def __init__(self, value: Any) -> None:
self.value = value
class Child(Base):
@classmethod
def _prepare(cls, *args: Tuple) -> Any:
return args[1] if len(args) > 1 else None
def method_not_present_on_base(self) -> None:
pass
有没有办法进行注释Base.create
,以便静态类型检查器可以推断Base.create()
返回的实例Base
和Child.create()
返回的实例Child
,以便以下示例通过静态分析?
base = Base.create(1)
child = Child.create(2, 3)
child.method_not_present_on_base()
在上面的示例中,静态类型检查器会正确地抱怨类method_not_present_on_base
中不存在Base
。
我想过Base
变成一个泛型类并让子类将自己指定为类型参数,即将CRTP引入 Python。
T = TypeVar('T')
class Base(Generic[T]):
@classmethod
def create(cls, *args: Tuple) -> T: ...
class Child(Base['Child']): ...
但这对于来自 C++ 的 CRTP 和所有...