【发布时间】:2019-07-22 11:46:39
【问题描述】:
我所知道的
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__()
我的问题
问题是我们必须将超级初始化调用放在__post_init__ 中,实际上它是在 数据类的 init 之后调用的。
缺点是我们失去了约定契约,初始化混乱导致我们无法覆盖超类的属性。
可以通过__pre_init__的概念来解决。我已经阅读了该文件,并没有看到与该概念有任何关系。我错过了什么吗?
【问题讨论】:
-
we can not override attributes of super classes是什么意思?你想在子类中有一个与父类同名的属性吗?比如class A: some_name: int和class B(A): some_name: int? -
@Arne 是的,同名属性。在 Scala 或 Java 中,父级总是先于子级初始化。并且子属性总是可以在初始化之后覆盖父属性。
-
好的,我想我明白了。但我认为这种原则不适用于手头的问题。我在my answer 中多用了几句。
标签: python inheritance python-dataclasses