面向對象之新式類、經典類,多繼承環境下 類 尋找成員的方式

1、什麼是經典類,什麼新式類?python

經典類、新式類是站在類否繼承 object 類的前提下的一個命名, 一個概念。算法

1.1 定義:python3.x

經典類: 當前類沒有繼承 object  類,那麼當前類就是 經典類。python2.7

新式類:當前類繼承 object 類,那麼當前類就是 新式類。spa

1.2 在ptyhon的不一樣版本中,經典類與新式類的存在狀況不同code

1.2.1 在 python3.X 版本中,因爲全部的類 默認都繼承 object類,因此有的類 都是 新式類。blog

  結論:在python3.x版本中,只有新式類繼承

解釋器爲python3.6 環境
class
Person1:pass # 默認繼承 object 類 class Person2(object):pass print(Person1.__bases__) # (<class 'object'>,) print(Person2.__bases__) # (<class 'object'>,) print(Person1.__dict__) # 返回一個字典,字典中存放了 類的全部屬性和值

1.2.2 在python2.7 版本中,全部的類 ,默認都不繼承 object 類,因此默認狀況下,類就是經典類,若是顯示聲明一個類 繼承 object 類,或者 一個類 經過 繼承關係的傳遞 繼承了object類,那麼就成爲新式類。class

   結論:在python 2.7 版本中,經典類和新式類 並存object

# 如下是在python2.7環境中執行的命令結果:
class Person3: pass         # 默認不繼承(不主動) object 類
print(Person3.__bases__)   # ()

class Person4(object):pass   # 顯示聲明一個類 繼承 object 類
print(Person4.__bases__)  #  (<type 'object'>,)

class Base:
    def func(self):
        print("我是Base類")
class child:
    def func(selfself):
        print("我是child類")
print(issubclass(child,object))  # False  在python2.7 中,在默認狀況下 ,都不繼承 object類,是經典類
print(issubclass(Base,object))   # False

class Base(object):   # 顯示聲明一個類 繼承 object 類
    def func(self):
        print("我是Base類")
class child(Base):
    def func(selfself):
        print("我是child類")
print(issubclass(child,object))  # True  可見繼承具備傳遞性
print(issubclass(Base,object))   # True

 1.3 當類是 經典類 或者 新式類  時,在多繼承環境下,從父類中尋找 成員的順序問題,或者叫找尋父類成員的方式:

   1.3.1 當類是 經典類 時,在多繼承環境下,會按照 深度優先方式 查找:

# 經典類,在多繼承環境,在父類中尋找成員的方式,遵循 「深度優先」 原則
class G:
    # def find(self):
    #     print("G")
    pass
class A:
    # def find(self):
    #     print("A")
    pass

class B(A):
    # def find(self):
    #     print("B")
    pass
class C(A):
    # def find(self):
    #     print("C")
    pass
class D(B,G):
    # def find(self):
    #     print("D")
    pass
class E(C):
    # def find(self):
    #     print("E")
    pass
class F(D,E):
    # def find(self):
    #     print("F")
    pass

f_obj = F()
f_obj.find()   # F --> D --> B --> A --> G --> E --> C -->

 

   

 

  總結:「深度優先」查找方式,從當前類開始查找 成員屬性或方法 ,當前類沒有,則查找 第一個繼承的父類 ,若沒有,則查找父類的父類,沿着父類的父類....,一直查找下去,查找到到就執行,若一直查找到了最頂層的類,則沿原路返回,看有沒有未查找的節點,左樹枝查找完畢沒有,則回到 當前類 這個根節點,查找第二個直接繼承的節點,的右樹枝。依次類推。

1.3.2  當前類 是 新式類 時, 在多繼承環境下,查找父類的成員時,會遵循 「廣度優先」方式 查找:

 

 

 結論: 當 嘗試 從B的父類 A 查找成員時,因爲A 有兩條路徑,能夠達到,直接回到 F 類,開始另外一個分支的查找

 

==

 

==

---

----

 

==

 

====

1.4 經典類和新式類的特色:

1.4.1 新式類:

  全部的多繼承關係尋找 方法的順序  --- 遵循廣度優先算法

  繼承object

       mro方法

  super(); super 不是單純的找父類,而是遵循mro順序

1.4.2 經典類

  不主動繼承object

  經典類在找父類方法的過程當中,遵循 深度優先

  不提供mro方法 和  super

相關文章
相關標籤/搜索