您当前的位置:首页 > 互联网教程

python中的super是什么-

发布时间:2025-05-14 21:11:23    发布人:远客网络

python中的super是什么-

一、python中的super是什么-

python中的super,名为超类,可以简单的理解为执行父类的__init__函数。由于在python中不论是一对一的继承,还是一子类继承多个父类,都会涉及到执行的先后顺序的问题。那么本文就着重看下super的具体作用。

通过设计这样一个案例,我们可以明确super的前后逻辑关系:先定义一个父类 initial,在这个父类中有参数值 param和函数 func,然后用子类 new来继承父类 initial。继承之后,在子类的 __init__函数中 super执行的前后去打印参数值 param和函数 func的返回值,相关代码如下所示:

首先我们注意到,父类 initial中的 __init__函数内的打印语句,是在super之后才输出的,这说明了, super函数是在执行父类的初始化操作。那么如果没有执行 super, new子类对 initial父类的继承体现在哪里呢?答案就是父类的成员函数,比如这样的一个案例:

其实就是删掉了子类中重载的成员函数,那么得到的结果如下:

可以发现在执行super之前就可以打印父类的 func函数的函数值。所以python中继承的逻辑是这样的:

initial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.paraminitial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.param

也正是因为只有执行了 super才能初始化父类中的成员变量,因此如果在super之前是无法访问父类的成员变量的。

本文通过一个python的实际案例的设计,来讲解python面向对象的技术——类的继承中必用的super函数的逻辑。其实我们可以把python中类的继承理解成这样的一个过程:当我们在括号中明确了父类时,其实已经引用了父类的成员函数,但是并没有执行父类的初始化函数。在执行子类的初始化函数的同时,会检查是否重载了父类的成员函数,如果重载则会直接覆盖。而只有在执行了super之后,才相当于执行了父类的初始化函数,此时才可以访问父类的成员变量。

本文首发链接为:

更多原著文章请参考:

打赏专用链接:

腾讯云专栏同步:

二、浅谈Python的super().__ init__()

在编程语言Python中,类的初始化方法通常通过 `__init__`函数定义。此方法用于在类的实例创建时执行特定操作,比如初始化实例变量。

然而,在继承结构中,如果一个子类希望从另一个类继承初始化逻辑,特别是当这两个类自身还可能被其他类继承时,理解如何正确地实现初始化就显得尤为重要。

当一个类作为另一个类的子类时,它有机会继承其父类的`__init__`方法。但继承顺序和调用策略则需特别注意,以确保子类能够恰当地初始化,同时避免不必要的覆盖或意外的调用顺序。

在Python中,`super()`函数用于获取一个类的父类对象。当在子类的`__init__`方法中使用 `super().__init__()`时,它会自动调用父类的`__init__`方法,并传递给它必要的参数,确保子类能够正确地继承初始化逻辑。

1.**没有自定义 `__init__`的子类**:当子类没有定义自己的`__init__`方法时,其构造函数会自动调用父类的`__init__`方法,遵循默认的继承顺序。

2.**自定义 `__init__`但不调用 `super().__init__`**:如果子类定义了自己的`__init__`方法,但未调用`super().__init__`,那么它不会继承父类的初始化逻辑。

3.**调用 `super().__init__`**:当子类明确调用 `super().__init__`时,它将遵循正确的初始化顺序,继承并执行父类的初始化操作。

以路由器和交换机为例,设计类结构如下:

定义路由器类时,通过 `__init__`方法初始化四个属性:厂商名(`name`)、类型(`mode`)、子型号(`number`)和三层协议支持(`l3protocol`)。

创建交换机类作为路由器的子类,调用 `super().__init__`来继承路由器的初始化方法,并添加新的属性(如生产地 `zone`),进一步扩展功能。

1.**类间方法调用顺序**:在继承结构中,理解类间的方法调用顺序对于确保类的正确实现至关重要。通过使用 `super().__init__`,可以确保子类能够遵循正确的初始化顺序,避免潜在的逻辑错误或覆盖问题。

2.**多重继承与方法覆盖**:在Python的多重继承中,`super()`方法提供了一种优雅的解决方案,以避免在调用父类方法时可能发生的混乱或冲突。通过明确地调用 `super().__init__`,可以确保在复杂继承关系中,初始化逻辑的正确执行。

综上所述,`super().__init__`的使用为解决多重继承带来的初始化顺序问题提供了清晰的路径,确保了类层次结构中的方法和属性初始化的一致性和可预测性。

三、Python: 你不知道的 super

1、在Python中,super是一个强大且灵活的工具,用于在类的继承中调用父类的方法。以下是关于super的一些关键点:

2、总结:super是Python中一个非常有用的特性,它允许开发者在类的继承中以一种灵活且可控的方式调用父类的方法。理解super的关键在于理解其基于MRO的工作原理,而不是简单地将其视为直接调用父类方法的工具。