提示子类中属性的特定类型,其中父类可以有多种类型

Hinting specific types for attributes in subclasses where parent can have many types

我有一个父 class Foo,它有一个属性 bar。它有两个 subclasses,每个 bar 都是不同的类型:FooStr 有 bar 作为 str,FooInt 有 bar 作为 int。 Foo 是一个抽象基础 class.

如何在子class中提示属性的特定类型,其中父项可以有多种类型?

这就是我的起点。 subclasses FooStr 和 FooInt 的提示告诉我 bar 是 str 或 int 的联合,不是很有用。

class Foo(abc.ABC):
    def __init__(self, bar: typing.Union[str, int], stuff):
        self.bar = bar
        self.stuff = stuff

class FooStr(Foo):
    pass

class FooInt(Foo):
    pass

接下来我尝试在 subclasses 的 init 方法中提示类型,但是在 subclasses 中提示 bar 仍然显示类型为联合。

class Foo(abc.ABC):
    def __init__(self, bar: typing.Union[str, int], stuff):
        self.bar = bar
        self.stuff = stuff

class FooStr(Foo):
    def __init__(self, bar: str, stuff):
        super().__init__(self, bar, stuff)

class FooInt(Foo):
    def __init__(self, bar: int, stuff):
        super().__init__(self, bar, stuff)

然后我尝试从父 init 中删除 bar,它提示子 classes 的正确类型,但没有在父 class 中定义 bar 对我来说似乎不正确。

class Foo(abc.ABC):
    def __init__(self, stuff):
        self.stuff = stuff

class FooStr(Foo):
    def __init__(self, bar: str, stuff):
        self.bar = bar
        super().__init__(self, stuff)

class FooInt(Foo):
    def __init__(self, bar: int, stuff):
        self.bar = bar
        super().__init__(self, stuff)

不知道从这里去哪里...

使用 Generic 基础 class,然后您可以在子class 父 class

时传递变量类型
from typing import Generic, TypeVar


T = TypeVar('T')


class Foo(Generic[T]):
    def __init__(self, bar: T, stuff):
        self.bar = bar
        self.stuff = stuff


class FooStr(Foo[str]):
    pass


class FooInt(Foo[int]):
    pass