我有一个基类,它继承自Sequence
(collections.abc
)。我希望能够从基类继承,为不同类型的对象提供创建方法,并为__getitem__
和__iter__
设置类型注释,以便我的IDE(PyCharm)可以显示特定顺序中对象的类型。
我认为我可以通过重写类属性并在基类中基于该类属性定义类型注释来完成此操作。但是看起来类型注释没有考虑重写属性。
这是我想做的一个最小示例(使用原始类型):
from collections.abc import Sequence
from typing import Any
from typing import Iterable
from typing import Tuple
from typing import Type
class BaseFactory(Sequence):
name: str = 'Base Factory'
obj_type: Type = Any
def create(self):
raise NotImplementedError
def __init__(self, *seq: obj_type):
self.items: Tuple[BaseFactory.obj_type] = tuple(seq)
def __getitem__(self, index: int) -> obj_type:
return self.items[index]
def __iter__(self) -> Iterable[obj_type]:
return iter(self.items)
def __len__(self) -> int:
return len(self.items)
class IntFactory(BaseFactory):
name = 'Int Factory'
obj_type = int
def create(self) -> obj_type:
return 1
class FloatFactory(BaseFactory):
name = 'Float Factory'
obj_type = float
def create(self) -> obj_type:
return 1.0
if __name__ == '__main__':
B = BaseFactory(1, 'string', 2.0)
# Shows inferred type as `Any`
any_obj = B[0]
I = IntFactory(1, 2, 3)
# Still shows inferred type as `Any`
int_obj = I[0]
F = FloatFactory(1.0, 2.0, 3.0)
# Still shows inferred type as `Any`
float_obj = F[0]
我可以通过完全重写子类中的__getitem__
和__iter__
并调用super
来完成此操作,但是我的实际代码中有许多方法必须覆盖,因为许多子类,只是为了更改返回类型。
是否有更简单的方法为每个子类指定对象类型?