我所知道的
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/