1. 程式人生 > >Python定義類時為什麼要繼承object類

Python定義類時為什麼要繼承object類

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

#新式類
class A(object):
    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()

#輸出結果 called C.foo() [Finished in 0.2s]
#經典類 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() #輸出結果 called A.foo() [Finished in
0.2s]

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