2010-04-26 99 views
13

我已經使用Python了很長一段時間了,而且我還不確定爲什麼你會從object繼承。是什麼這之間的區別:爲什麼有必要從Python中的對象繼承子類?

class MyClass(): 
    pass 

這:

class MyClass(object): 
    pass 

據我瞭解,object是所有類的基類和子類是隱含的。你從它的明確子類獲得任何東西嗎?什麼是最「Python」的事情?

回答

12

這是python 2.x中的oldstyle和新風格類。第二種形式是最新版本,存在於Python 2.2及以上版本。對於新代碼,您只能使用新的樣式類。

在Python 3.x中,你可以再次使用兩種形式,因爲新的風格是唯一剩下的,而且兩種形式都是真正的等價形式。不過,我相信你應該繼續使用MyClass(object)表格,即使對於3.x代碼,至少在Python 3.x被廣泛採用以避免與用於2.x的代碼的潛在讀者之間的任何誤解。

舊樣式和新樣式類之間的行爲與使用super()等某些功能有很大不同。

在這裏看到:New Style classes

您還可以看到here上SO。

+1

3.X無效 – 2010-04-26 16:57:20

+0

@Noctis - 什麼對於3.x無效?舊式?舊的/新的區別? – phkahler 2010-04-26 17:13:28

+0

繼承自Object的默認行爲是Python 3.x – 2010-04-26 17:17:27

7

與@kriss,@Noctis和@Carson一致。從我更多的顏色:

class X: passclass X(): pass經典類class X(object): pass同義詞是新式的類,你可以在這裏看到:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<type 'classobj'>, <type 'classobj'>, <type 'type'>) 

看看提供的linky @kriss瞭解更多細節。 Python 3中無效的是經典類的概念...原因是因爲經典類已被棄用。所有三種成語在任何3.x中只創建新式課程:

>>> class X:pass 
... 
>>> class Y(): pass 
... 
>>> class Z(object): pass 
... 
>>> 
>>> type(X), type(Y), type(Z) 
(<class 'type'>, <class 'type'>, <class 'type'>) 

這意味着底線是什麼?如果你使用Python 2進行編碼,儘可能使用新式的類。這樣,您已經建立了遷移路徑。加上新式課程提供比傳統課程更多的功能。 (這有點主觀,但如果你的[classic]類相對簡單,那麼你可能不需要做任何事情來讓它們在Python 3中工作。)

+1

+1個很好的例子。 – 2010-04-26 18:11:12