zoukankan      html  css  js  c++  java
  • Python super继承详解

    MRO(Method resolution order)是python用来解析方法调用顺序的,mro中记录了一个类的所有基类的类类型序列,super不是简单地调用基类的方法,而是按照MRO中的顺序来调用类的方法。
    使用super()时,应该在所有类中使用,否则就可能发生有的类构造函数没有调用的情况。
     1 #!/usr/bin/python
     2 # -*- coding: utf-8 -*-
     3 class A(object):
     4     def __init__(self):
     5         print 'A __init__'
     6         super(A, self).__init__()
     7         print 'leave A'
     8 class C(object):
     9     def __init__(self):
    10         print 'C __init__'
    11         super(C, self).__init__()
    12         print 'leave C'
    13 class B(A,C):
    14     def __init__(self):
    15         print 'B __init__'
    16         super(B, self).__init__()
    17         print 'leave B'
    18 class D(B):
    19     def __init__(self):
    20         print 'D __init__'
    21         super(D, self).__init__()
    22         print 'leave D'
    23 if __name__ == '__main__':
    24     D()
    25 
    26 输出为:
    27 D __init__
    28 B __init__
    29 A __init__
    30 C __init__
    31 leave C
    32 leave A
    33 leave B
    34 leave D


    编译过程:super(D,self)查找D的父类,根据广度优先算法依次查找super(类名,self)的父类。

    顺便说一下 经典类和新式类的区别?

    (1)在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A())
    (2)
     新式类对象可以直接通过__class__属性获取自身类型:type
    (3)继承搜索的顺序发生了改变,经典类多继承时属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧(即深度优先搜索);新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动(即广度优先搜索)。

    如下图所示:

    mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类)。
    
    
    之前查看了很多资料,说mro是基于深度优先搜索算法的。但不完全正确在Python2.3之前是基于此算法,但从Python2.3起应用了新算法:C3算法。
    为什么采用C3算法
    C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。
    本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。
    单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。
    ------------------------------新式类和旧式类中查找属性的顺序不同-------------------------------------
    在新式类中,查找一个要调用的函数或者属性的时候,是广度优先搜搜的。
    在旧式类当中,是深度优先搜索的。
    
    
    感谢关注
  • 相关阅读:
    前端与后端的一些论述
    Pandas Cheat Sheet
    flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
    【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介
    【Java并发编程实战】-----“J.U.C”:锁,lock
    【Java并发编程实战】-----synchronized
    【java并发编程实战】-----线程基本概念
    2015年读书系统
    阮一峰文集:《一个寻找作者的读者》
    进一步封装highchart,打造自己的图表插件:jHighChart.js
  • 原文地址:https://www.cnblogs.com/wspblog/p/4279949.html
Copyright © 2011-2022 走看看