我正在使用抽象基类(称为策略模式)实现 Python 接口。我希望能够用 Pydantic 做到这一点。
如果没有 Pydantic,我会使用如下属性:
from abc import ABC, abstractproperty
@dataclass
class PersonEntity(ABC):
@abstractproperty
def first_name(self):
raise NotImplementedError
@abstractproperty
def last_name(self):
raise NotImplementedError
@dataclass
class Person(PersonEntity):
@property
def first_name(self):
return 'Jimmy'
@property
def last_name(self):
return 'Kelly'
这样,如果我要实现另一个类,比如
@dataclass
class SillyPerson(PersonEntity):
@property
def first_name(self):
return 'Jimmy'
@property
def last_name(self):
return 'Kelly'
@property
def sillyness(self):
return 5
那么界面就会报错。这有助于约束任何继承自PersonEntity
.
但是,我想将此信息吐到 FastAPI 响应对象中。如果不找出某种序列化程序来获取每个属性字段的所有值,以及只是属性字段(我正在努力做到这一点),我就无法做到这一点。
我宁愿使用 Pydantic。在这种情况下,我不需要属性,我可以简单地做:
from pydantic import BaseModel
class PersonEntity(ABC, BaseModel):
first_name: str
last_name: str
class Person(PersonEntity):
first_name: str
last_name: str
这些将以我需要的方式序列化,但我失去了接口功能,因为现在我没有属性,因此无法使用 @abstractproperty
.
所以如果我要实施
class SillyPerson(PersonEntity):
first_name: str
last_name: str
sillyness: str
没有错误,因为 pydantic 允许这样做。
(顺便说一句,在这些示例中,我不确定是否从子类中的 BaseModel 继承。)
有什么方法可以约束 Pydantic 模型给我我需要的接口行为,当引入一个不包含在 ABCPersonEntity
类中的字段时抛出错误?