数据类: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