数据类使用 kw_only 继承所有变量

问题描述 投票:0回答:1

我正在练习使用超级函数和数据类继承。当父类具有默认值时,我启用了 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
python inheritance python-dataclasses
1个回答
0
投票

如果没有任何自定义逻辑,则不应在数据类中定义

__init__
方法。如果您确实有自定义逻辑,则应该在
__post_init__
方法中定义它们。

您的代码会产生错误,因为当子类的

__init__
方法设置为仅接受关键字参数时,它会使用位置参数调用基类的
__init__
方法。您可以通过传递关键字参数来修复它,或者简单地从子类中完全删除
__init__
方法,因为已经为数据类生成了一个已经考虑到继承的方法。

© www.soinside.com 2019 - 2024. All rights reserved.