代码之家  ›  专栏  ›  技术社区  ›  George Liu

如何在Pydantic中重写父类属性

  •  0
  • George Liu  · 技术社区  · 2 年前

    我想覆盖父类属性装饰的属性,如下所示:

    from pydantic import BaseModel
    
    class Parent(BaseModel):
      name: str = 'foo bar'
      
      @property
      def name_new(self):
        return f"{'_'.join(self.name.split(' '))}"
      
    
    class Child(Parent):
      name_new = 'foo_bar_foo'
    

    但我总是犯这样的错误: NameError: Field name "name_new" shadows a BaseModel attribute; use a different field name with "alias='name_new'".

    我试过这个:

    from pydantic import BaseModel, Field
    
    class Parent(BaseModel):
      name: str = 'foo bar'
      
      @property
      def name_new(self):
        return f"{'_'.join(self.name.split(' '))}"
      
    
    class Child(Parent):
      name_new_new = Field('foo_bar_foo', alias='name_new')
    
    c = Child()
    

    然而 c.name_new 仍然具有的值 foo_bar 而不是 foo_bar_foo 。如何在Child类中重写,以便 name_new 属性的值为 foo_bar_foo ?谢谢

    1 回复  |  直到 2 年前
        1
  •  1
  •   tempkdw    2 年前

    不能重写pydantic BaseModel的属性。

    考虑使用init方法。

    from pydantic import BaseModel
    
    class Parent(BaseModel):
      name: str = 'foo bar'
      name_new: str = ''
      
      def __init__(self):
          super().__init__()
          if not self.name_new:
            self.name_new = f"{'_'.join(self.name.split(' '))}"
    
      
    
    class Child(Parent):
      name_new: str = 'foo_bar_foo'
    
    print(Parent().name_new)
    # foo_bar
    print(Child().name_new)
    # foo_bar_foo