我有一个用例,我有两个抽象类。其中一个类(此处为
Carpenter
)将另一个类(此处为Hammer
)作为类变量。这背后的想法是Carpenter
然后可以以通用方式实例化一个Hammer
(实际上它也涉及更多的子类化)。
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import ClassVar
@dataclass
class Tool(ABC):
name: str
@dataclass
class Worker(ABC):
_TOOL: ClassVar[Tool]
@abstractmethod
def get_tool(self) -> Tool:
raise NotImplementedError
@dataclass
class Hammer(Tool):
name: str = field(default="hammer", init=False)
color: str
@dataclass
class Carpenter(Worker):
_TOOL = Hammer
def get_tool(self) -> Hammer:
return self._TOOL(color="red")
if __name__ == '__main__':
print(Carpenter().get_tool())
# Hammer(name='hammer', color='red')
这段代码工作得和我预期的一样好,但 MyPy 并不喜欢它。
28: error: Incompatible types in assignment (expression has type "Type[Hammer]", base class "Worker" defined the type as "Tool") [assignment]
31: error: Cannot determine type of "_TOOL" [has-type]
是否有另一种方法可以满足 MyPy 的要求,或者是否无法以这种满足类型检查器的方式将多个类耦合在一起?
我只对Python 3.8及以上感兴趣