Python dataclasses:super()的继承等价物是什么?

Python dataclasses:super()的继承等价物是什么?,python,python-3.x,Python,Python 3.x,我有这两门课 class Parent: def __init__(self, parent_name, parent_age): self.parent_name = parent_name self.parent_age = parent_age class Child(Parent): def __init__(self, child_name, gender): self.child_name = child_name

我有这两门课

class Parent:
    def __init__(self, parent_name, parent_age):
        self.parent_name = parent_name
        self.parent_age = parent_age


class Child(Parent):
    def __init__(self, child_name, gender):
        self.child_name = child_name
        self.gender = gender

        
        super().__init__('Miguel', 29)


c = Child('Kevin', 'Male')

c.parent_name
c.parent_age
c.child_name
c.gender
我试图用dataclass实现它

如何将父类的属性继承给子类

例如:

@dataclass
class Parent:
    parent_name: str
    parent_age: int


@dataclass
class Child(Parent):
    child_name: str
    gender: str

    # Inherit here
根据注释中的linked by,使子类继承父类字段的最基本方法是什么都不做。dataclass装饰器将为您组合这两个类的字段

子类的行为就像它有四个字段一样,从父类继承的字段开始,以自己的字段结束。生成的uuu init_uuuu方法将接受四个参数,并按照您的预期进行初始化

如果您想为继承的字段添加默认值,这有点棘手,因为您通常需要为所有后面的字段提供默认值,因为继承的字段首先出现。但是,如果需要,可以使用init=False的字段覆盖继承的属性,这样就不会将其放入_uinit__;方法中:

对于您的示例代码,有一件事我要小心:确保继承是您真正想要的。可能是希望子类包含对父对象的引用,而不是从类继承。在面向对象编程中,继承意味着两个类之间的关系,例如子类是父类,这没有多大意义。相反,使用引用的合成模型具有-A关系,例如,子对象具有-A父对象。您可能不想使用编程继承来表示现实世界中的继承关系

因此,最好的模型可能更像这样:

@dataclass
class Person:
    name: str
    age: int
    parent: "Person" = None

miguel = Person("Miguel", 39)       # the parent
kevin = Person("Kevin", 0, miguel)  # the child
根据注释中的linked by,使子类继承父类字段的最基本方法是什么都不做。dataclass装饰器将为您组合这两个类的字段

子类的行为就像它有四个字段一样,从父类继承的字段开始,以自己的字段结束。生成的uuu init_uuuu方法将接受四个参数,并按照您的预期进行初始化

如果您想为继承的字段添加默认值,这有点棘手,因为您通常需要为所有后面的字段提供默认值,因为继承的字段首先出现。但是,如果需要,可以使用init=False的字段覆盖继承的属性,这样就不会将其放入_uinit__;方法中:

对于您的示例代码,有一件事我要小心:确保继承是您真正想要的。可能是希望子类包含对父对象的引用,而不是从类继承。在面向对象编程中,继承意味着两个类之间的关系,例如子类是父类,这没有多大意义。相反,使用引用的合成模型具有-A关系,例如,子对象具有-A父对象。您可能不想使用编程继承来表示现实世界中的继承关系

因此,最好的模型可能更像这样:

@dataclass
class Person:
    name: str
    age: int
    parent: "Person" = None

miguel = Person("Miguel", 39)       # the parent
kevin = Person("Kevin", 0, miguel)  # the child

... 你不需要做任何事情,这段代码已经做了你想要的。。。。你不需要做任何事情,这段代码已经做了你想要的。太棒了,谢谢,谢谢