python类初始化详解_python类中super() 的使用解析
描述
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
(, , , , )
整个执行过程,当实例化对象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() 的使用解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对云海天教程网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
python类初始化详解_python类中super() 的使用解析相关推荐
- python爬虫程序详解_Python网络爬虫之三种数据解析方式
指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指 ...
- 【无标题】类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypen
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- 类模板详解\n类模板的定义及实例化 模板参数
类模板详解\n类模板的定义及实例化\ntemplate\u003Cclass 模板参数>\nclass 类名 {\n // 类定义\n};\n\ntemplate\u003Ctypenam ...
- python协程详解_python协程详解
原博文 2019-10-25 10:07 − # python协程详解 ![python协程详解](https://pic2.zhimg.com/50/v2-9f3e2152b616e89fbad86 ...
- python的抽象类详解_Python抽象类以及元类
抽象基类: 继承的约束与协议 __doc__ = """ 抽象基类: 继承的约束与协议 # 抽象基类 --- 有点java的味道,也有点golang的味道,继承,协议,接 ...
- python scatter参数详解_Python中scatter函数参数及用法详解
最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下: 1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如 ...
- python scatter参数详解_Python 中 scatter 函数参数及用法详解
Python 中 scatter 函数参数及用法详解 Python 中 scatter 函数参数及用法详解 这里有新鲜出炉的 Python 教程, 程序狗速度看过来! Python 编程语言 Pyth ...
- python算术运算符详解_Python中关于算术运算符的实例详解
这篇文章主要介绍了Python算术运算符实例详解的相关资料,需要的朋友可以参考下 Python算术运算符 以下假设变量a为10,变量b为20: 运算符 描述 实例 + 加 - 两个对象相加 a + b ...
- python average函数详解_python 函数详解
函数函数是代码的一种组织形式 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数,无返回结果的叫过程,python不加以区分 ...
最新文章
- win7蓝屏_Win7大面积蓝屏?急!解决办法在这儿~
- weblogic(CVE-2018-2628漏洞复现)
- ie浏览器发送错误报告提示怎么关闭
- Object类 java 1614965390
- 数百台湾人把名字改成“鲑鱼”去吃免费日料,结果有人改不回来了
- Websphere 手动模拟删除应用操作
- 字符集 ISO-8859-1(3)
- JSP的自定义标签(一)
- CentOS 7 service systemnctl
- Caffe傻瓜系列(10):draw_net.py绘制caffe net结构
- logout退出功能是怎么实现的?login登陆功能室怎么实现的
- 【p093】细胞分裂
- 计算机图形处理的一些知识
- 通过WIFI唤醒终端设备
- 艾美捷RPMI-1640培养基含L-谷氨酰胺的功能和研究
- CefSharp的ChromiumWebBrowser截出来的图片是空白
- 使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!
- Rpgmakermv(24 )yep_coreengine
- 屏幕小于6英寸的手机_来!推荐几款6英寸以内“小屏手机”给你
- CAD图纸无法正常缩放怎么办?如何解决?
热门文章
- 如何解决WIN7下默认打开方式无效的问题
- 电力系统四象限功率计算程序问题分析
- DSP:C54x定时器及使用定时器产生led的1s周期闪烁
- javaweb开发实战经典pdf,移动架构师成长路线
- excel怎么自动换行
- 下载的音乐如何转成MP3?分享两种将音频转换为MP3格式的方法
- xp快捷方式 *.lnk 图标(winxp 桌面快捷方式都变成.lnk打不开的处理方法)
- 规范化(normalize)到底是什么,以及哪些算法需要规范化
- 自建小米插座服务器,暴力拆解小米智能插座并修复
- 向善的力量:顺丰,如何在不确定性中寻求确定性