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

How to Define Class Attributes after Inheriting Pydantic's BaseModel?

在正常情况下 python classes 我可以定义 class 属性,例如

class Example:
  x = 3
  def __init__(self):
    pass

然后如果我执行 Example.xExample().x,我会得到 3

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

例如:

class Example(BaseModel):
  x = 3

print(Example.x)
--> type object 'Example' has no attribute 'x'

我希望能够定义 class 级别属性。什么是正确的 method/syntax?

你正确定义了class关卡属性,但是你读错了。 从这个 class 中读取变量时,您应该访问 class 而不是另一个定义 class 的变量。像这样:

from pydantic import BaseModel
class User(BaseModel):
  x = 3
user = User()
print(user.x)

给出什么:3

Okey-dokey,我终于一探究竟了。答案在于 dataclasses 如何处理 class 变量。 (回想起来应该是显而易见的,但你生活和学习)

存在一个名为 ClassVar 的类型。当 class 的属性用 ClassVar 键入时,它就变成了 class 变量。

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


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

print(Example.x)
>>> 3