显式设置继承,不变 __init__ 与在 Python 中跳过它

Explicitly setting inherited, unchanged __init__ vs skipping it in Python

如果 parent class 和 child class 需要相同的 __init__,我可以想到两种主要的方法...

1.使用 super() 显式声明 __init__

class Parent:
    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2


class Child(Parent):
    def __init__(self, attr1, attr2):
        super().__init__(attr1, attr2)

    def do_something(self):
        return self.attr1 + self.attr2

2。就继承__init__

class Parent:
    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2


class Child(Parent):

    def do_something(self):
        return self.attr1 + self.attr2

这里有更好的方法吗?基本继承应该有效(而且似乎有效),但最好明确说明 object(是否继承)的实例是如何初始化的?

我问的主要原因是因为我从来没有真正看到 __init__ 被跳过的例子,但这可能只是因为通常需要更改或添加 __init__ 行为.

(我已经 searching/reading 尝试了很多其他问题,但找不到答案,如果这是重复的,我们深表歉意。)

谢谢!

如果 Child 中的构造函数相同,则没有理由重写它。所以我肯定会选择解决方案 2,因为解决方案 1 除了代码复制之外什么也没增加。如果您遵循方法 1,Parent.__init__ 中的更改也需要更改所有子类 __init__

尽管在这两种解决方案中,您都忘记了从 self 访问属性(应该是 self.attr1,而不是 attr1)。