• 第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的世界。
    欢迎大家批评指正,谢谢大家关注!
     

  • 相关阅读:
    OO开发
    重构:Extract Method (提炼函数)
    Vue 一个组件引用另一个组件
    闭包
    视差滚动原理与实现
    JS中的constructor 和 prototype
    jQuery 为动态添加的元素绑定事件
    setTimeout 的理解
    关于Vertical Align的理解
    网页特效:滚动视差设计指南
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087692.html
Copyright © 2020-2023  润新知