继承Pydantic的BaseModel后如何定义类属性?

Ala*_*lan 22 python-3.x pydantic

在普通的 python 类中,我可以定义类属性,例如

class Example:
  x = 3
  def __init__(self):
    pass
Run Code Online (Sandbox Code Playgroud)

如果我接着做Example.xor Example().x,我就得到了3

当我继承 pydantic's 时BaseModel,我不知道如何定义类属性,因为定义它们的通常方法被 BaseModel 覆盖。

例如:

class Example(BaseModel):
  x = 3

print(Example.x)
--> type object 'Example' has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)

我希望能够定义类级别属性。正确的方法/语法是什么?

Ala*_*lan 42

好吧,我终于弄清楚了。答案在于数据类如何处理类变量。(回想起来,这应该是显而易见的,但你生活并学习)

存在一种称为 的类型ClassVar。当类的属性用 键入时ClassVar,它就成为类变量。

class Example(BaseModel):
  x: ClassVar[int] = 3
  y: int


# Usage
print(Example().x)
>>> ValidationError

print(Example.x)
>>> 3

Run Code Online (Sandbox Code Playgroud)

  • `ClassVar` 是在 `typing` 中定义的,所以不要忘记导入它(`fromtyping import ClassVar`) (8认同)