python - 为什么子进程的init方法中使用Python super?

标签 python class inheritance super

根据Python docs super ()

is useful for accessing inherited methods that have been overridden in a class.

我知道 super 指的是父类,它允许您访问父方法。我的问题是为什么人们总是在子类的 init 方法中使用 super ?我到处都看到过它。例如:

class Person:

    def __init__(self, name):
        self.name = name

class Employee(Person):
    def __init__(self, **kwargs):
       super().__init__(name=kwargs['name']) # Here super is being used

    def first_letter(self):
        return self.name[0]

e = Employee(name="John")
print(e.first_letter())

我可以在没有 super 甚至没有 init 方法的情况下完成同样的任务:

class Person:

    def __init__(self, name):
        self.name = name

class Employee(Person):

    def first_letter(self):
        return self.name[0]

e = Employee(name="John")
print(e.first_letter())

后一个代码有缺点吗?对我来说它看起来干净多了。我什至不必使用样板 **kwargs 和 kwargs['argument'] 语法。

我正在使用Python 3.8。 编辑:这是一个 nother stackoverflow问题中有来自不同人的代码,他们在 child 的 init 方法中使用 super 。我不明白为什么。我最好的猜测是 Python 3.8 中有一些新东西。

最佳答案

子类可能想做一些与父类(super class)所做的不同的或更可能附加的事情 - 在这种情况下,子类必须有一个 __init__

调用 super 的 init 意味着您不必在子类 init 中复制/粘贴该 init(这会影响维护),否则如果您想在子 init 中添加一些额外的代码,则需要这样做。

但请注意,如果您使用多重继承(例如调用哪个 super),则使用 super 的 init 会很复杂,这需要小心。就我个人而言,我会避免多重继承并将继承保持在最低限度 - 很容易被诱惑创建多个继承/类层次结构,但我的经验是“保持简单”的方法通常会更好。

关于python - 为什么子进程的init方法中使用Python super?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61174178/

相关文章:

c# - 使用基础和MVVM通信在构造函数处进行C#继承

python - 打印用户给出的具体时间 python

python - 类变量作为封闭类的实例

java - 为什么接口(interface)只能在顶级类中声明?

javascript - 为什么我的状态计数器比它应该的值少一个值?

c# - 如何重构重复的事件处理代码

javascript - 没有 new 或 Object.create 的原型(prototype)继承

python - 更新解析用户信息以跟踪 kivy 应用程序中的玩家分数

python - 如何在张量板上绘制权重直方图?

python - 计算行数并对其编号