【问题标题】:Class inheritance in Python 3.7 dataclassesPython 3.7 数据类中的类继承
【发布时间】:2023-04-05 07:29:02
【问题描述】:

我目前正在尝试 Python 3.7 中引入的新数据类结构。我目前坚持尝试对父类进行一些继承。看起来参数的顺序被我当前的方法搞砸了,因此子类中的 bool 参数在其他参数之前传递。这会导致类型错误。

from dataclasses import dataclass

@dataclass
class Parent:
    name: str
    age: int
    ugly: bool = False

    def print_name(self):
        print(self.name)

    def print_age(self):
        print(self.age)

    def print_id(self):
        print(f'The Name is {self.name} and {self.name} is {self.age} year old')

@dataclass
class Child(Parent):
    school: str
    ugly: bool = True


jack = Parent('jack snr', 32, ugly=True)
jack_son = Child('jack jnr', 12, school = 'havard', ugly=True)

jack.print_id()
jack_son.print_id()

当我运行这段代码时,我得到了这个TypeError

TypeError: non-default argument 'school' follows default argument

我该如何解决这个问题?

【问题讨论】:

  • 我认为值得注意的是,在 attrs / dataclass 类型的 Python 范式中,组合通常比继承更受欢迎。像这样扩展您的子类的__init__ 模糊地违反了LSP,因为您的各种子类不能互换。需要明确的是,我认为这种方式通常很实用,但如果你没有考虑使用组合:创建一个不继承的 Child 数据类,然后有一个 child 属性也可能是有意义的Parent 类。

标签:
python
python-3.x
python-3.7
python-dataclasses