我所知道的
Python数据类允许通过数据类或类进行继承。在最佳实践中(在其他语言中也是如此),当我们进行继承时,应该首先调用初始化。在Python中,它是:
def __init__(self):
super().__init__()
...
我在做什么
因为数据类是在Python3.7中引入的,所以我正在考虑用数据类替换我的所有类。使用数据类,它的好处之一就是为您生成__init__
。当数据类需要继承基类时,这是不好的--例如:
class Base:
def __init__(self):
self.a = 1
@dataclass
class Child(Base):
a:int
def __post_init__(self):
super().__init__()
My problem
问题是我们必须将超级初始化调用放在__post_init__
中,这实际上是在dataclass的初始化之后调用的。
缺点是我们失去了约定契约,初始化混乱导致我们不能覆盖超类的属性。
这个问题可以用__pre_init__
的概念来解决。我已经阅读了文档,并没有看到任何与该概念有关的内容。我是不是遗漏了什么?
发布于 2019-03-01 04:06:28
实际上,有一个方法是在__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
发布于 2019-02-28 22:37:04
这样如何:
from dataclasses import dataclass
class Base:
def __init__(self, a=1):
self.a = a
@dataclass
class Child(Base):
def __post_init__(self):
super().__init__()
ch = Child()
https://stackoverflow.com/questions/54927763
复制相似问题