我正在练习使用超级函数和数据类继承。当父类具有默认值时,我启用了 kw_only 属性。我完全理解,如果您只是传递变量,则不需要在数据类中使用 super,并且我可以避免在此处使用 super。我的目标是通过这个例子更好地理解超级功能。但我无法理解收到的错误消息。
@dataclass(kw_only=True)
class ZooAnimals():
food_daily_kg: int
price_food: float
area_required: float
name: str
c = ZooAnimals(food_daily_kg=565, price_food=40, area_required=10, name='Monkey'
)
print(c)
@dataclass(kw_only=True)
class Cats(ZooAnimals):
meowing: str
def __init__(self, food_daily_kg, price_food, area_required, meowing, name):
self.meowing = meowing
super().__init__(food_daily_kg, price_food, area_required, name)
z = Cats(food_daily_kg=465, price_food=30, area_required=10, meowing='Little Bit',
name='Leopard'
)
print(z)
Out:
ZooAnimals(food_daily_kg=565, price_food=40, area_required=10, name='Monkey')
TypeError: ZooAnimals.__init__() takes 1 positional argument but 5 were given
如果没有任何自定义逻辑,则不应在数据类中定义
__init__
方法。如果您确实有自定义逻辑,则应该在 __post_init__
方法中定义它们。
您的代码会产生错误,因为当子类的
__init__
方法设置为仅接受关键字参数时,它会使用位置参数调用基类的 __init__
方法。您可以通过传递关键字参数来修复它,或者简单地从子类中完全删除 __init__
方法,因为已经为数据类生成了一个已经考虑到继承的方法。