zoukankan      html  css  js  c++  java
  • python

    继承:

    #继承
    #什么时候用继承?
    # 1.当类之间有显著的不同,并且较小的类是较大的类的所需的组建时,用组合比较好.
    # 2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好
    
    # 单继承
    class A():
        M = 10000
        def __init__(self,name):
            self.name = name
        def AA(self):
            print("AA")
    
    class B(A):
        pass
    
    class C(A):
        M = 999999
    
    #在dict属性字典里,B是没有父类A 的属性的.
    print(A.__dict__)
    print(B.__dict__)
    
    #实例化后,B继承了A的类属性以及函数属性
    abc = B('anec')
    print(abc.name)
    print(abc.M)
    print(abc.AA)
    
    #在C类中定义了M属性,所以访问M属性时,首先会从C类找M属性.
    #C类中新增M属性与父类相同,并不覆盖父类的M属性
    abc = C("abc")
    print(abc.name)
    print(abc.M)
    print(A.M)
    print(abc.AA)
    
    
    # 继承循序:
    # python的类继承可以继承多个类,java和C#中则只能继承一个类
    # python的类如果继承了多个类,那么其寻找方法的方式有两种:
    # 深度优先
    # 广度优先
    # 
    # 当类是经典类时,多继承情况下,会按照深度优先方式查找
    # 当类是新式类时,多继承情况下,会按照广度优先方式查找
    # 
    # 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了更多的功能,也就是之后推荐的写法,
    # 从写法上区分的类或者父类继承了object类,那么该类便是新式类,否则就是经典类.
    
    
    # 继承核心:
    #python 如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表
    #这个MRO列表就是一个简单的所有基类的线性顺序列表
    
    #为了实现继承python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止.
    # 而这个MRO列表的构造是通过一个C3线性算法来实现的.我们不去深究这个算法的数据原理
    # 实际上就是合并所有父类的MRO列表并遵循如下三条准则
    # 1.子类会优先于父类被检查
    # 2.多个父类会根据他们在列表中的顺讯被检查
    # 3.如果对下一个类存在两个合法的选择,选择第一个父类
    
    
    # 新式类
    #python3 以后都是新式类继承
    class A(object):
        def test(self):
            print('A')
    class B(A):
        def test(self):
            print('B')
    class C(A):
        def test(self):
            print('C')
    class D(B):
        def test(self):
            print('D')
    class E(C):
        def test(self):
            print('E')
    class F(D,E):
        def test(self):
            print('F')
    
    #查看继承规则:(新式类才有的方法)
    print(F.mro())
    #[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
    # 新式类继承顺序:(先将一侧的类查询至基类之前一个类,再查询另一边类至基类)
    # F-D-B-E-C-A-object
    
    # 而经典类经常顺序为:(先将一侧的类查询完毕再查询第二类)
    # F-D-B-A-E-C
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/Anec/p/9763126.html
Copyright © 2011-2022 走看看