类三大特性(继承 多态 封装)

继承

  1 先说下什么是经典类 什么事是新式类

     Python 2 当中类分为新式类和经典类 Python 3中全部叫新式类  python 2中如果有继承父类是object 就是新式类,继承其他类不算,但是如果继承其他类,其他类有其他了object 那就是新式类

    经典类:

    class 类名:
      pass

    新式类:
    class 类名(object):
      pass

  2 Python 2 继承,如果类是经典类,继承方式如下图

  

 

  3 Python 3 继承因为python 3 都是新式类 如果python 2是新式类也是这样的继承

   

class A(object):
    def test(self):
        print('from A')

class B(A):
    def test(self):
        print('from B')

class C(A):
    def test(self):
        print('from C')

class D(B):
    def test(self):
        print('from D')

class E(C):
    def test(self):
        print('from E')

class F(D,E):
    # def test(self):
    #     print('from F')
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性

#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类

4  继承原理(python如何实现的继承)python 2中没有__mro__

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

 

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类

5 super()子类中调用父类的方法

class A(object):
    def __init__(self,name):
        self.name = name
        print(self.name)

    def run(self):
        print('测试测试测试')
        print(self.name)


class B(A):
    def __init__(self,age):
        self.age = age
        super().__init__('王Sir')  #调用父类中的__init__方法
        #super(B,self).__init__('王Sir')  #还有另外一种调用方法,跟上面一样

    def test(self):
        super().run()      #调用父类中的run方法 self都不用写了
        print('test')

ret = B('22')
ret.run()

# 结果为:
#   王Sir
#   测试测试测试
#   王Sir

猜你喜欢

转载自www.cnblogs.com/ajaxa/p/9049518.html