指定作为子类型的类型
Specify type that is a subtype
我们正在指定一个抽象 class 以及这样的实现:
from abc import ABC
class Base(ABC):
...
class Type1(Base):
def __init__(self, var1: str):
...
那我们就试着这样用
from typing import Dict
constructors: Dict[str, Base]= {'type1': Type1}
constructors['type1']("") # Error here
但是我们在 IDE 中收到一个错误,指出 Base
不可调用——这是事实。我们如何指定我们的字典值是 Base
class 的后代,其中 是 可调用的?
注释 Dict[str,Base]
表示 dict
将 str
键映射到 实例 的值 Base
(或它的子 classes)。您希望这些值是 class Base
(或其子 class 之一)本身,因此您需要改用 Type[Base]
。 (就像 Base
等人一样。是 (meta)class type
的实例。)
constructors: Dict[str, Type[Base]] = {'type1': Type1}
constructors['type1']("")
你的 IDE 是否足够聪明,判断 constructors['type1']
是否抽象是另一回事。
我们正在指定一个抽象 class 以及这样的实现:
from abc import ABC
class Base(ABC):
...
class Type1(Base):
def __init__(self, var1: str):
...
那我们就试着这样用
from typing import Dict
constructors: Dict[str, Base]= {'type1': Type1}
constructors['type1']("") # Error here
但是我们在 IDE 中收到一个错误,指出 Base
不可调用——这是事实。我们如何指定我们的字典值是 Base
class 的后代,其中 是 可调用的?
注释 Dict[str,Base]
表示 dict
将 str
键映射到 实例 的值 Base
(或它的子 classes)。您希望这些值是 class Base
(或其子 class 之一)本身,因此您需要改用 Type[Base]
。 (就像 Base
等人一样。是 (meta)class type
的实例。)
constructors: Dict[str, Type[Base]] = {'type1': Type1}
constructors['type1']("")
你的 IDE 是否足够聪明,判断 constructors['type1']
是否抽象是另一回事。