经典类与新式类、钻石继承(菱形继承)、多继承之“广度优先”“深度优先”

内容摘要
  新式类:     1)凡是继承object的类或子孙类都是新式类     2)在python3中所有的类都是新式类(默认继承object)     经典类:     1)必须在python2中才会有经典
文章正文

  新式类:

    1)凡是继承object的类或子孙类都是新式类

    2)在python3中所有的类都是新式类(默认继承object)

 

  经典类:

    1)必须在python2中才会有经典类与新式类之分

    2)在python2中,凡是没有继承object的类,都是经典类

 

# 新式类:
class User(object):
    pass

class Sub(User):
    pass


# 在python3中所有的类都是新式类(默认继承object)
class Bar:
    pass

print(Bar.__bases__)    # (<class "object">,)

 

 

  在python3中提供了一个新式类查找属性和方法的顺序的内置方法:

    mro():会把当前类的继承关系列出来

    调用mro返回的是一个继承序列:

      super()的继承序列严格遵循mro继承序列

 

  新式类查找属性和方法的顺序:

    1)先从子类中查找

    2)若子类中没有,从父类中查找,如果继承多个父类的情况下:从左到右

    3)若父类中也没有,从object中查找

    4)若object中也没有则报错

class Father1:
    x = 10

class Father2:
    x = 20

class Father3:
    x = 30

# 多继承的情况下:从左到右
class Sub(Father1, Father2, Father3):
    # 注意:__int__  不是  __init__
    def __init__(self):
        print(super().x)


obj = Sub()
print(Sub.mro())
# 子类和父类中都没有这个方法,但是object中有,所以从object中找到.__dir__
print(Sub.__dir__)

  执行结果:

10
[<class "__main__.Sub">, <class "__main__.Father1">, <class "__main__.Father2">, <class "__main__.Father3">, <class "object">]
<method "__dir__" of "object" objects>

 

 

  继承多个父类的情况下会造成"钻石继承"

 

  例:多继承

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")


print(F.mro())

  执行结果:

[<class "__main__.F">, <class "__main__.D">, <class "__main__.B">, <class "__main__.E">, <class "__main__.C">, <class "__main__.A">, <class "object">]

  继承结果图:

   因为整体形状像钻石或者像菱形,所以叫做钻石继承,也叫做菱形继承。(类似的形状也可以,前提是多继承)

 

 

  python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。

  内置方法mro()的查找顺序:

    - 新式类

      从左到右,广度优先

 

    - 经典类

      从左到右,深度优先

 

  两种概念图:

 

  新式类广度优先演示:

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

class B(A):
    # def test(self):
        # print("from B")
    pass

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

class D(B):
    # def test(self):
    #     print("from D")
    pass

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

class F(D, E):
    # def test(self):
    #     print("from F")
    pass


obj = F()
print(obj.test())

  执行结果:

from E

 

  经典式深度优先不做展示。

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!