Python 具有可重写静态属性的抽象类注释

Python 具有可重写静态属性的抽象类注释,python,mypy,python-typing,Python,Mypy,Python Typing,我有一个抽象类: import abc from pydantic import BaseModel class Abstract(abc.ABC): context_class: ClassVar[Type['BaseModel']] error: ClassVar[Type[Exception]] def __init__(self, data: Dict) -> None: self.context = self.context_class

我有一个抽象类:

import abc
from pydantic import BaseModel

class Abstract(abc.ABC):
    context_class: ClassVar[Type['BaseModel']]
    error: ClassVar[Type[Exception]]

    def __init__(self, data: Dict) -> None:
        self.context = self.context_class(**data)

    @abc.abstractmethod
    def process(self) -> None:
        pass
在它的继承器中,我覆盖了属性
上下文\u类

class Context(BaseModel):
    email: str

class Concrete(Abstract):
    context_class = Context

    def process(self) -> None:
        print(self.context.email)
Mypy检查失败,出现以下错误:

... error: "BaseModel" has no attribute "email"
软件包版本:

  • Python 3.8.2
  • Mypy 0.770
  • Pydantic 1.6.1

最后,找到了答案。应使用泛型类型:

导入abc
输入import ClassVar、Type、Dict、Generic、TypeVar
从pydantic导入BaseModel
T=TypeVar('T',bound=BaseModel)
类摘要(abc.abc,Generic[T]):
上下文类:ClassVar[Type[T]]
错误:ClassVar[类型[异常]]
定义初始化(self,数据:Dict)->无:
self.context=self.context\u类(**数据)
@抽象方法
def过程(自身)->无:
通过
类上下文(基本模型):
电邮:str
类具体(抽象[上下文]):
上下文类=上下文
def过程(自身)->无:
打印(self.context.email)