我在代码中经常遇到这样的情况,我想定义重写其基类的方法的子类,同时返回基类抽象方法的原始类型提示的特定子类型。
看来我有两个选择,那就是
Foo
)Bar
)当具有多个继承级别且许多类型提示被子类中的子类型覆盖时,泛型类的 TypeVar 列表可能会变得相当长。在这种情况下我应该使用泛型,还是只覆盖类型提示?
示例:
class BaseA:
pass
AType = TypeVar('AType', bound=BaseA)
class BaseB1(metaclass=abc.ABCMeta):
@abc.abstractmethod
def method1(self: Self) -> BaseA:
pass
class BaseB2(Generic[AType], metaclass=abc.ABCMeta):
@abc.abstractmethod
def method1(self: Self) -> AType:
pass
class ASub(BaseA):
pass
class Foo(BaseB1):
def method1(self: Self) -> ASub:
return ASub()
class Bar(BaseB2[ASub]):
def method1(self: Self) -> ASub:
return ASub()
在我看来,泛型有用的地方是当使用
BaseB2[something]
时,而不是 Bar
。但这仍然没有回答我的问题...
从mypy看来,在执行重写时,如果不使用Generic,那么在缩小方法参数类型或扩大方法返回类型时会产生错误。然而,正如我之前所说,对于我正在编写的类,TypeVar 列表变得相当长(6 个以上带有详细名称的 TypeVar),而且我不知道如何以简洁的方式编写它。