第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法
前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的。由于super方法的特殊性,本节单独谈一谈super方法。
一、super简介
1. super方法返回一个“super”类型的对象,注意是一个新的类型,并不是父类;
2. 使用“super().方法名”调用并不是用于直接调用当前类的父类的方法,而是Python根据MRO算法去所有父类中查找找到的第一个与“方法名”同名的某个父类方法,因此如果某子类继承多个超类、或某子类有多个层级的超类时,这些超类中有多个同名的方法时,只会执行一次;
3. 在多重继承情况下,使用在类内使用“super().方法名”调用时,不一定是调用上一层的超类的方法,也可能是超类的超类的方法。
三、 使用super的优点
1. 超类类名修改之后,不需要在所有子类中进行类名修改;
2. 在单继承中 super 用来调用父类的方法的,多重继承情况下可以使用super解决多个同名方法执行谁的问题,在super机制里可以保证公共父类的方法仅被执行一次,至于执行的顺序,是按照MRO进行的。
四、 super的使用
1. 通过super方法无需传递self参数,是因为super这个方法执行时,Python会自动将当前类和当前实例作为super的参数,调用后返回的是一个super对象;
2. 调用父类方法 时, 此时父类中 self 并不是父类的实例而是子类的实例;
3. super类体内实例方法调用时,直接调用super方法,无需带任何参数。这是因为super类型本身是个类,在调用super()时,实际上会执行这个类的构造函数,这个构造函数要求同时传入参数子类名和当前实例名,在实例方法中Python自动地传入这两个参数;
4. 在类体外调用时,可以通过”super(类名,实例名)”方式调用super;
5. 在类内定义时,“super().方法名”、“超类名.方法名()”两种调用方式不要混用,因为二者搜索“方法名”对应的算法不同,可能会导致编程人员无法预测的结果。五、 一个例子
#抽象类虚拟子类及super方法样例
def dirp(iter): return [i for i in dir(iter) if not i.startswith('__')]
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def getArea(self):pass #定义获取面积的抽象方法
def __init__(self,area): #定义shape的构造方法
print("In ShapeInit")
self.area1=area #定义基类的实例变量area1,子类中直接继承
def getArea2(self):return self.area1 #定义getArea2方法,该方法有抽象基类实现,子类继承
class Output(ABC):
def __init__(self):
print("In OutputInit")
@abstractmethod
def output(self):print(dirp(self))#输出实例自定义属性
class Circle(Shape,Output):
def __init__(self,radius):
super().__init__(9) #调用超类方法的构造函数
self.radius = radius
self.area = 3.14*self.radius*self.radius
self.girth = 6.28*self.radius
def getArea(self): return self.area
def getGirth(self):return self.girth
def output(self): #输出实例的内容
print("area={:.2f},girth={:.2f}".format(self.area,self.girth))
super().output()
cir=Circle(10)
cir.getArea2()
执行截图:
六、 参考知识
super涉及到的MRO算法以及一些更深入的内容,请大家参考如下博文:
https://www.jb51.net/article/87807.htm
https://www.jb51.net/article/66912.htm
https://www.cnblogs.com/xinghuaikang/p/8481712.html
本节介绍了super方法访问超类方法的原理和使用方法,并介绍了三个进一步深入了解super的博文。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.22节 Python中使用super调用父类的方法的更多相关文章
- python使用super()调用父类的方法
如果要在子类中引用父类的方法,但是又需要添加一些子类所特有的内容,可通过类名.方法()和super()来调用父类的方法,再个性化子类的对应函数. 直接使用类名.方法()来调用时,还是需要传入self为 ...
- 【Python】Python中子类怎样调用父类方法
python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...
- Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法
public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); prin ...
- 第11.22节 Python 中re模块的字符串分割器:split函数
一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...
- 关于继承中的super()调用父类构造方法
super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. 每当你new一个子类对象的时候,子类对象都隐式内置了一个父类对象.所以说,为了那个内置的父类 ...
- [py]super调用父类的方法---面向对象
super()用于调用父类方法 http://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. clas ...
- 认识python中的super函数
需求分析 在类继承中,存在这么一种情况: class Human(object): def Move(self): print("我会走路...") class Man(Human ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
随机推荐
- 剑指offer之打印超过数组一半的数字
问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- Core WebApi项目快速入门(三):踩坑笔记
目前做公司一个项目,遇到了一些坑.跟大家分享,避免再次采坑. 1. 服务端发布应用报错 在windows server上发布程序报错.系统缺少更新包. https://support.microsof ...
- 经典c程序100例==11--20
[程序11] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1 ...
- gdb 符号表 &信息 &工具
查看二进制文件的编译器版本 strings info.o |grep GCCGCC: (crosstool-NG linaro-1.13.1-2012.02-20120222 - Linaro GC ...
- linux系统中离线安装python3.7过程记录
最近公司新弄来一台linux redhat 4.4.7服务器,准备在上面离线安装python3.7,安装过程中出现一些问题,特此记录下来. 首先在python官网上下载了 Python-3.7.3. ...
- Docker学习—Swarm
前言: 前一篇<Docker学习-Machine>中对Machine 进行了学习,本篇继续学习Swarm,那么Swarm是什么呢,有什么用呢?接下来一步步了解. 一.什么是Docker-S ...
- Qt QPainter画个球啊
Qt QPainter画个球啊 目录 Qt QPainter画个球啊 看效果 方法 代码 看效果 方法 使用绘图事件,绘制一个图形 使用定时事件,不停更新图形位置 代码 .h #pragma once ...
- burp使用
只拦截特定网站数据包 我们以只拦截"www.baidu.com"为例 点击"Add"--布尔运算选择"And"--匹配类型选择"D ...
- [web安全原理分析]-XEE漏洞入门
前言 1 前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致 ...
- bWAPP----iFrame Injection
iFrame Injection 直接上代码 1 <div id="main"> 2 3 <h1>iFrame Injection</h1> 4 ...