第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. 【Kata Daily 190916】String end with?(字母结尾)

    题目: Complete the solution so that it returns true if the first argument(string) passed in ends with ...

  2. 知识管理——得到CEO脱不花女士的一次分享

    知识管理--得到CEO脱不花女士的一次分享 近日,公司举办了一场"CKO首席知识官"研讨会,邀请到了得到APP的CEO脱不花女士做了一场精彩的分享,让我深受启发. 分享内容围绕3个 ...

  3. CSS总结(一)

    1 css常用的一些属性 color: 文字颜色(前景色) font-size: 文字大小 font-family: 字体,比如:微软雅黑, 黑体,宋体,仿宋体,"Times New Rom ...

  4. 【有奖众测】给HMS Core文档提建议,赢大奖华为Watch!

    为了提升HMS Core开发者的文档体验,提升开发效率,邀请所有开发者体验HMS Core文档,并贡献您的建议. 无论是文档让您困惑的地方,还是您发现的问题,或者您觉得可以做的更好的地方,都可以尽情的 ...

  5. 学习笔记——make项目中克隆GitHub目录失败的解决

    在示例项目中执行make后出现下面的错误 WARNING: Missing submodule components/json/cJSON... WARNING: Missing submodule ...

  6. 内网渗透 day3 -metasploit的使用

    metasploit的使用 目录 一.msf基本操作 1 二.msf模块(比较重要的四个) 2 三.木马生成 2 四.开启监听模块(最常用的模块) 3 一.msf基本操作 1. 使用msfconsol ...

  7. 内网渗透 day1-基础

    粘滞键和放大镜 1. 到/windows/system32下用takeown改变该文件夹下的文件拥有权(因为粘滞键和放大镜都在system32文件夹下) cd /Windows/system32    ...

  8. git 分支合并到master

    [参考:] https://segmentfault.com/q/1010000000181403  我们一般这样:远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: # 去自己的工作分支 ...

  9. react 中组件状态的一些理解

    组件状态:即 state 只有当state发生变化时,组件才会更新. 当一个html标签的值依赖于state的值得时候,如果state的值没有更新时,这个标签的值无论如何也是不会更新的. 看下面示例: ...

  10. 美团 Java 面试 154 道题分享!

    Java集合22题 ArrayList 和 Vector 的区别. 说说 ArrayList,Vector, LinkedList 的存储性能和特性. 快速失败 (fail-fast) 和安全失败 ( ...