覆盖Pydantic实例的方法



有很多方法可以覆盖实例上的方法。但是对于pydantic BaseModel的对象,这似乎是有问题的。这是一个简单的例子:

from pydantic import BaseModel
class Dog(BaseModel):
def bark(self):
print("WOOF")
def new_bark():
print("WoOoOoF!!")

运行方法:

>>> boby = Dog()
>>> boby.bark()
WOOF

重写方法:

>>> boby.bark = new_bark
>>> boby.bark()
ValueError: "Dog" object has no field "bark"

预期结果将是打印的# WoOoOoF!!。如果Dog没有继承pydanticsBaseModel,您将得到预期的结果。

这可能吗?

我认为这个问题与pydantic的__setattr__方法有关。它与普通物体有些不同。在这个环节中,人们处理(不相同但相似的)问题。https://github.com/samuelcolvin/pydantic/issues/655

我不知道pydantic的内部细节或问题的原因,但我认为这段代码可以解决你的问题:

>>> object.__setattr__(boby, "bark", new_bark)
>>> boby.bark()
WoOoOoF!!