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
  • 相关阅读:
    之前的博客
    用struts2 s2-045漏洞拿站记录
    修改BlackLowKey皮肤样式,增加占屏比
    SpringBoot自动配置原理
    CAS无锁技术
    CAS单点登录原理解析
    死锁与活锁的区别,死锁与饥饿的区别
    jvm问题
    jdk动态代理的实现原理
    抽象工厂
  • 原文地址:https://www.cnblogs.com/Anec/p/9763126.html
Copyright © 2011-2022 走看看