我正try 在带有定制__init_函数的PYDANIC中使用继承.我有父类(FISH)和子类(SHARK),它们在初始化时都需要比设置字段(在MWE中由一个额外的print语句表示)更多的初始化.所以我需要重写他们的初始信息.
我试过:
class fish(BaseModel):
name: str
def __init__(self, name):
super().__init__(name=name)
print("Fish initialization successful!")
class shark(fish):
color: str
def __init__(self, name, color):
super().__init__(name=name)
self.color=color
print("Shark initialization successful!")
f = fish(name="nemo")
print(f)
s = shark(name="bruce", color="grey")
但这引发了一个验证错误:
Fish initialization successful!
name='nemo'
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
Cell In[149], line 17
15 f = fish(name="nemo")
16 print(f)
---> 17 s = shark(name="bruce", color="grey")
Cell In[149], line 11, in shark.__init__(self, name, color)
10 def __init__(self, name, color):
---> 11 super().__init__(name=name)
12 self.color=color
13 print("Shark initialization successful!")
Cell In[149], line 4, in fish.__init__(self, name)
3 def __init__(self, name):
----> 4 super().__init__(name=name)
5 print("Fish initialization successful!")
File ~/Desktop/treeline_wt/1588-yieldmodeling-integration/device-predictions/.venv/lib/python3.9/site-packages/pydantic/main.py:341, in pydantic.main.BaseModel.__init__()
ValidationError: 1 validation error for shark
color
field required (type=value_error.missing)
我从一位有效的同事那里得到的解决方案是:
class fish(BaseModel):
name: str
def __init__(self, **kwargs):
super().__init__(**kwargs)
print("Fish initialization successful!")
class shark(fish):
color: str
def __init__(self, **kwargs):
super().__init__(**kwargs)
print("Shark initialization successful!")
# f = fish(name="nemo")
# print(f)
s = shark(name="bruce", color="grey")
在判断时,其仅在鱼super().__init__
接收到color
关键字时才起作用,即,将其改变为super().__init__(name=kwargs['name'])
会抛出相同的验证错误.这让我感到困惑,我不明白为什么鱼类需要知道它的子类的任何属性.我该如何理解这一点?