0

我正在使用抽象基类(称为策略模式)实现 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类中的字段时抛出错误?

4

0 回答 0