Pydantic 实例上的覆盖方法
Overwrite method on Pydantic instance
有许多解决方案可用于覆盖实例上的方法。但是对于一个 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
不继承 pydantics BaseModel
你会得到预期的结果。
这可能吗?
我认为这个问题在某种程度上与 pydantic 的 __setattr__
方法有关。它与普通物体有些不同。在这个 link 中,人们处理(不相同但相似的)问题。 https://github.com/samuelcolvin/pydantic/issues/655
我不知道 pydantic 的内部细节或问题的原因,但我认为这段代码可以解决您的问题:
>>> object.__setattr__(boby, "bark", new_bark)
>>> boby.bark()
WoOoOoF!!
有许多解决方案可用于覆盖实例上的方法。但是对于一个 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
不继承 pydantics BaseModel
你会得到预期的结果。
这可能吗?
我认为这个问题在某种程度上与 pydantic 的 __setattr__
方法有关。它与普通物体有些不同。在这个 link 中,人们处理(不相同但相似的)问题。 https://github.com/samuelcolvin/pydantic/issues/655
我不知道 pydantic 的内部细节或问题的原因,但我认为这段代码可以解决您的问题:
>>> object.__setattr__(boby, "bark", new_bark)
>>> boby.bark()
WoOoOoF!!