gpt4 book ai didi

python - 控制Python数据类继承类时的初始化顺序

转载 作者:太空狗 更新时间:2023-10-30 02:51:39 25 4
gpt4 key购买 nike

我所知道的
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__。所以你可以这样做:在Child.__new__中调用Base.__init__。我不能说这是一个好的解决方案,但如果您有兴趣,这里有一个可行的示例:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com