微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

覆盖 Pydantic 实例的方法

如何解决覆盖 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 不继承 pydantics BaseModel,您会得到预期的结果。

这甚至可能吗?

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。