新式類、經典類

繼承 object 類的是新式類,不繼承 object 類的是經典類,在 Python 2.7 里面新式類和經典類在多繼承方面會有差異:

class A:
    def foo(self):
        print('called A.foo()')

class B(A):
    pass

class C(A):
    def foo(self):
        print('called C.foo()')

class D(B, C): 
    pass

if __name__ == '__main__':
    d = D() 
    d.foo()

B、C 是 A 的子類,D 多繼承了 B、C 兩個類,其中 C 重寫了 A 中的 foo() 方法。如果 A 是經典類(如上代碼),當調用 D 的實例的 foo() 方法時,Python 會按照深度優先的方法去搜索 foo() ,路徑是 B-A-C ,執行的是 A 中的 foo() ;如果 A 是新式類,當調用 D 的實例的 foo() 方法時,Python 會按照廣度優先的方法去搜索 foo() ,路徑是 B-C-A ,執行的是 C 中的 foo() 。因為 D 是直接繼承 C 的,從邏輯上說,執行 C 中的 foo() 更加合理,因此新式類對多繼承的處理更為合乎邏輯。在 Python 3.x 中的新式類貌似已經兼容了經典類,無論 A 是否繼承 object 類, D 實例中的 foo() 都會執行 C 中的 foo() 。但是在 Python 2.7 中這種差異仍然存在,因此還是推薦使用新式類,要繼承 object 類。

作者:鄒沖
鏈接:https://www.zhihu.com/question/19754936/answer/202650790
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。