数据类:super().__init__()的继承等价物是什么?

我有这两门课

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

回答

根据该dataclasses文件(通过链接jonrsharpe在评论),最基本的方法,使你的Child类继承的领域Parent是什么也不做。该dataclass装饰将结合这两个类的领域为您服务!

Child班将像它有四个字段,开始从继承者Parent,并拥有自己的结局。生成的__init__方法将接受四个参数并按照您的预期进行初始化。

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

from dataclasses import field

@dataclass
class Child(Parent):
    child_name: str
    gender: str
    parent_name: str = field(default="Miguel", init=False)
    parent_age: str = field(default=29, init=False)

鉴于您的示例代码,我要注意的一件事是:确保继承确实是您在这里想要的。可能您希望您的Child包含Parent对象的引用,而不是从类继承。在面向对象编程中,继承意味着两个类之间的IS-A关系(例如,一个Child IS-A Parent,这没有多大意义)。相比之下,使用引用的组合对HAS-A关系建模(例如,一个Child HAS-A Parent)。您可能不想使用编程继承来表示现实世界的继承关系!

所以最好的模型可能更像这样:

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

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


以上是数据类:super().__init__()的继承等价物是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>