【问题标题】:Overwrite method on Pydantic instancePydantic 实例上的覆盖方法
【发布时间】:2021-01-23 08:47:35
【问题描述】:

有许多解决方案可用于覆盖实例上的方法。但是对于 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 你会得到预期的结果。

这可能吗?

【问题讨论】:

  • 不应该用一个参数定义 new_bark 吗?

标签: python pydantic


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2010-09-28
    相关资源
    最近更新 更多