第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调用父类的方法的更多相关文章

  1. python使用super()调用父类的方法

    如果要在子类中引用父类的方法,但是又需要添加一些子类所特有的内容,可通过类名.方法()和super()来调用父类的方法,再个性化子类的对应函数. 直接使用类名.方法()来调用时,还是需要传入self为 ...

  2. 【Python】Python中子类怎样调用父类方法

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...

  3. Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

    public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); prin ...

  4. 第11.22节 Python 中re模块的字符串分割器:split函数

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  5. 关于继承中的super()调用父类构造方法

    super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. 每当你new一个子类对象的时候,子类对象都隐式内置了一个父类对象.所以说,为了那个内置的父类 ...

  6. [py]super调用父类的方法---面向对象

    super()用于调用父类方法 http://www.runoob.com/python/python-func-super.html super() 函数是用于调用父类(超类)的一个方法. clas ...

  7. 认识python中的super函数

    需求分析 在类继承中,存在这么一种情况: class Human(object): def Move(self): print("我会走路...") class Man(Human ...

  8. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  9. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

随机推荐

  1. vue踩坑

    1. 双向绑定的对象 改变或新增其属性 DOM不刷新问题 var obj = { "attr1": "1", "attr2": [2] }; ...

  2. 《Python3反爬虫原理与绕过实战》作者韦世东

    可以用(k1,k2)-k1来设置,如果有重复的key,则保留key1,舍弃key2/打印appleMap{1=Apple{id=1,name=苹果1,money=3.25,num=10},2=Appl ...

  3. Mybatis执行SQL的流程

    前篇:Mybatis初始化过程 SqlSession : SqlSession是一个接口,它有两个实现类:DefaultSqlSession (默认)和 SqlSessionManager (弃用,不 ...

  4. netfilter 的扩展功能 helper tftp-nat

    /* 需要对conntrack进行功能扩展的协议,会初始化一个struct nf_conntrack_helper 实例,把该实例注册到Netfilter中管理的全局哈希表中. 查找helper使用的 ...

  5. 利用移动硬盘安装windows7系统

    首先把win7系统镜像的iso文件解压到移动硬盘中 将移动硬盘设置为活动分区 设置活动分区的方法 Diskpart程序实现U盘安装WIN7的方法: 将Win7安装盘中的所有文件拷贝到硬盘文件夹中,我们 ...

  6. Java从后端下载文件到浏览器

    // 注: // 获取项目下文件或者文件流 // File file = new File(this.getClass().getResource("/xls/adminImportUser ...

  7. 入坑 docsify,一款神奇的文档生成利器!

    layout: postcategory: javatitle: 入坑 docsify,一款神奇的文档生成利器!tagline: by 沉默王二tags: - java Guide 哥是我认识的一个非 ...

  8. C语言复习系列-转义字符

    C语言复习系列-转义字符 准备学习stm32单片机,感觉需要复习一下C语言,翻看了菜鸟教程,竟然有不少地方看不懂,真让人汗颜······ 转义字符大部分语言里面都有,至少我学过的里面都有,在这些语言中 ...

  9. 干货 MySQL常见的面试题 + 索引原理分析

    常见的面试必备之MySQL索引底层原理分析: MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 1)问题:数据库中最常见的慢查询优化方式是什么? 回答:加索引 2)问题: ...

  10. Java 用jxl读取excel并保存到数据库(此方法存在局限,仅限本地电脑操作,放在服务器上的项目,需要把文件上传到服务器,详细信息,见我的别的博客)

    项目中涉及到读取excel中的数据,保存到数据库中,用jxl做起来比较简单. 基本的思路: 把excel放到固定盘里,然后前段页面选择文件,把文件的名字传到后台,再利用jxl进行数据读取,把读取到的数 ...