• 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
  • 相关阅读:
    windows 程序设计自学:窗口正中显示Hello,World
    为网站图片增加延迟加载功能,提升用户体验
    线性表顺序存储
    sys.stdout sys.stderr的用法
    python 跳出嵌套循环方法
    * 与 ** 在调用函数时的作用
    twisted 学习笔记二:创建一个简单TCP客户端
    给命令行上色
    __new__ 的简单应用
    网友对twisted deferr的理解
  • 原文地址:https://www.cnblogs.com/Anec/p/9763126.html
Copyright © 2020-2023  润新知