python类中super() 的使用解析
作者:larryli007 发布时间:2022-12-02 09:08:10
描述
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
super(type[, object-or-type])
Python中类的初始化都是__init__(), 所以父类和子类的初始化方式都是__init__(), 但是如果子类初始化时没有这个函数,那么他将直接调用父类的__init__(); 如果子类指定了__init__(), 就会覆盖父类的初始化函数__init__(),如果想在进行子类的初始化的同时也继承父类的__init__(), 就需要在子类中显示地通过super()来调用父类的__init__()函数。
super()在单继承中的应用:
举个例子:
class Animal: #定义一个父类
def __init__(self): #父类的初始化
self.name = 'animal'
self.role = 'parent'
print('I am father')
class Dog(Animal): #定一个继承Animal的子类
def __init__(self): #子类的初始化函数,此时会覆盖父类Animal类的初始化函数
print('I am son')
self.name = 'dog' #定义子类的name属性
super(Dog,self).__init__() #在子类进行初始化时,也想继承父类的__init__()就通过super()实现
#self.name = 'dog' #若将name属性的定义(即第10行)放在这儿,最终输出将是dog
animal = Animal()
xbai = Dog()
print(xbai.name)
print(xbai.role)
输出为:
I am father #实例化Animal类后的输出
I am son #实例化Dog类后的输出
I am father #实例化Dog类后的输出
animal #由于子类初始化是在进行继承父类初始化之前,因此super()执行后,Dog类的name属性被父类覆盖
parent #继承了父类的role属性
说明:super(Dog,self)也可以写成super(),可以理解成super(Dog,self).__init__() == Animal.__init__(self),( super(Dog,self) == Animal ) 即其返回的是当前类的继承顺序中(针对多继承)Dog后的一个类(也即类Animal)
self 和 super的区别:
self会首先调用自己的方法或者属性,当自身没有目标属性或方法时,再去父类中寻找;super会直接去父类中寻找目标属性或方法。如上述代码中定义完第十行后,self.name的返回值为'dog',而super().name的返回值为'animal';
self时类,super是预编译指令
super()在多继承中的应用:
代码例子:
class Base(object): #定义父类
def __init__(self):
print('Base create')
class ChildA(Base): #子类A
def __init__(self):
print('Enter A')
super(ChildA,self).__init__()
print('Leave A')
class ChildB(Base):
def __init__(self):
print('Enter B')
super(ChildB,self).__init__()
self.name = 'B'
print('Leave B')
class ChildC(ChildA,ChildB):#在继承时,按照继承顺序返回继承顺序的下一个类
pass
## (这里需要介绍的是,当类继承多个类时,python3中是按照广度优先算法,即在类ChildC的继承关系中,会先找到靠近其的基类ChildA,然后继承其的初始化函数__init__(),就不会再继承ChildB的初始化函数)
c = ChildC() #实例化对象
print(c.__class__.__mro__) #对象c的继承顺序应该是 ChildC---ChildA---ChildB---Base---object
输出结果:
Enter A
Enter B
Base create
Leave B
Leave A
(<class '__main__.ChildC'>, <class '__main__.ChildA'>, <class '__main__.ChildB'>, <class '__main__.Base'>, <class 'object'>)
整个执行过程,当实例化对象c时,按照类的继承顺序,先初始化类ChildC(),由于C中未定义初始化函数__init__(),因此直接调用其继承的基类ChildA的__init__()初始化方法,运行到代码行第8行时,按照继承顺序super(ChildA,self)返回的是类ChildB(),因此,super(ChildA,self).__init__() == ChildB().__init__(self),因此就可以理解产生输出结果的原理。
从super()方法中可以看出,super()的第一个参数可以是继承链(继承顺序)中的任意一个类的名字,也可以不填,不填时第一个参数默认为当前类,即代码第10行 super(ChildA,self).__init__() ==super().__init__(),其返回值为在继承链中输入参数类的下一个类。
结论:
super()用来继承基类的属性和方法
单继承时,super().__init__() 和 父类.__init__()实现的功能是类似的
super不是父类,而是继承顺序的下一个类
super()可以避免重复调用
总结
以上所述是小编给大家介绍的python类中super() 的使用解析网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/larryli007/article/details/83476441
猜你喜欢
- 作用: 构建一些简单的SQL语句,结合在提交表单时使用,可以较方便<%@LANGUAGE="VBSCRIPT&
- 概率论啊概率论,差不多忘完了。基于概率论的分类方法:朴素贝叶斯1. 概述贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称
- 很多时候可能需要在一个图中画出多条函数图像,但是可能y轴的物理含义不一样,或是数值范围相差较大,此时就需要双y轴。matplotlib和se
- 本文实例讲述了python实现将html表格转换成CSV文件的方法。分享给大家供大家参考。具体如下:使用方法:python html2csv
- 一、前言刚刚学了一些python文件读写的内容,先跑过来整活了。顺便复习一下之前学的东西。import timedoc_local='
- 本文实例讲述了kNN算法python实现和简单数字识别的方法。分享给大家供大家参考。具体如下:kNN算法算法优缺点:优点:精度高、对异常值不
- MVC设计模式MVC (Model-View-Controller) 是软件工程中常用的软件架构模式,它是一种分离业务逻辑与显示界面的设计方
- 虽然今年名义上已经不再管人了,但也不得不掺和进很多人事,这里想简单说说,即使不能帮助这个行业的从业者规划职业道路,也算是把之前摸过的路小结一
- Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4
- 工欲善其事,必先利其器。作为更专业的前端工程师,我们需要强劲的IDE协助我们写出规范、美观、漂亮的JavaScript代码,首先要作的就是对
- 本文实例讲述了php简单生成随机字符串的方法。分享给大家供大家参考,具体如下:生成一组:<?php$str = "01234
- #HelloWorld是文件名称,Hello是类from HelloWorld import Hello调用,Hello类的方法:>&
- 2009年2月24日,Safari 4.0 beta版正式发布,Safari从它的3.2版本开始就已经支持所有的CSS选择器(包括最新的CS
- 在进行WEB标准网页设计时,必不可少的是写入大量的CSS语法,一般情况下我们可以通过Dreamweaver软件的“CSS样式”面板自动生成相
- 本文实例讲述了Python实现计算文件MD5和SHA1的方法。分享给大家供大家参考,具体如下:不多说,直接源码:#file md5impor
- 自动发送邮件能应用于许多场景,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了。为什
- 朋友的网站要计算机票的折扣价格,并且在最后的折扣价格上应对个位进行四舍五入,同时在ASP和Javasc
- class EntryDemo( Frame ): """Demonstrate Entrys and Eve
- 以前看过几个JS代码格式的,自己也来写了一个,呵呵,优点是可以处理超长的 JS 而不会死机.........IE Only运行代码框<
- 目的:把question_id 对应的user_answer转成ABCDsolutiondfa=df.groupby('questi