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

问题描述

如果父类和子类需要相同的 __init__,我可以想到两种主要方法来做到这一点...

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

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


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

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

2.只需继承__init__

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


class Child(Parent):

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

这里有首选方法吗?基本继承应该有效(并且似乎有效),但明确说明对象实例(是否继承)的初始化方式是否更好?

我问这个问题的主要原因是因为我从未真正见过 __init__ 被跳过的例子,但这可能只是因为通常需要更改或添加 __init__ 行为。

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

谢谢!

解决方法

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...