我所知道的
Python数据类允许使用数据类或类进行继承。
在最佳实践(以及其他语言)中,当我们进行继承时,应首先调用初始化。在Python中,它是:

def __init__(self):
    super().__init__()
    ...

我在做什么
由于数据类是在Python 3.7中引入的,因此我正在考虑将所有类替换为数据类。
使用数据类,它的好处之一就是为您生成__init__。当数据类需要继承基类时,这不是很好-例如:
class Base:
    def __init__(self):
        self.a = 1

@dataclass
class Child(Base):
    a:int
    def __post_init__(self):
        super().__init__()

我的问题
问题是我们必须将 super 初始化调用放在__post_init__内,实际上是在数据类的 init 之后调用的。
缺点是我们失去了约定约定,并且初始化困惑导致我们无法覆盖父类(super class)的属性。

可以通过__pre_init__的概念来解决。我已经阅读了该文档,并且在那里没有看到与该概念有关的任何内容。我想念什么吗?

最佳答案

实际上,在__init__之前有一种方法被称为:__new__。因此,您可以执行以下技巧:在Base.__init__中调用Child.__new__。我不能说这是一个好的解决方案,但是如果您有兴趣,请引用以下示例:

class Base:
    def __init__(self, a=1):
        self.a = a


@dataclass
class Child(Base):
    a: int

    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        Base.__init__(obj, *args, **kwargs)
        return obj


c = Child(a=3)
print(c.a)  # 3, not 1, because Child.__init__ overrides a

关于python - 当Python数据类继承类时,控制初始化顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54927763/

10-12 19:55