2013-08-20 107 views
4

當類從空無繼承時,我有一個實例類型的對象。爲什麼從對象繼承對Python有影響?

>>> class A(): pass; 
>>> a = A() 
>>> type(a) 
<type 'instance'> 
>>> type(a) is A 
False 
>>> type(A) 
<type 'classobj'> 

然而,當我有相同的類從一個對象繼承,創建的對象是A.

>>> class A(object): pass; 
>>> a = A() 
>>> type(a) 
<class '__main__.A'> 
>>> type(a) is A 
True 
>>> type(A) 
<type 'type'> 

這背後的邏輯類型?這是否意味着每個類都應該從對象繼承?

+0

也密切相關:[老風格和新式類在Python(http://stackoverflow.com/q/54867) –

回答

7

在Python 3,這兩個是相同的。在Python 2,但是:

class A: pass # old-style class 

class B(object): pass # new-style class 

New-style and classic classes文檔中:

最多的Python 2.1,老式類是提供給用戶的唯一的味道。 (舊式)類的概念與類型的概念無關:如果x是舊式類的實例,則x.__class__指定類x,但type(x)總是<type 'instance'>。這反映了一個事實,即所有舊式實例獨立於它們的類,都使用一種稱爲實例的內置類型實現。

在Python 2.2中引入了新風格的類來統一類和類型。新風格的類既不多也不少於用戶定義類型。 如果x是新風格類的實例,則type(x)x.__class__相同。

引入新風格類的主要動機是提供一個完整的元模型的統一對象模型。它還具有許多直接的好處,例如能夠對大多數內置類型進行子類化,或者引入可用於計算屬性的「描述符」。

由於這些原因,儘可能使用新風格的類是一個好主意。 Python 2.2+中存在舊式類的唯一原因是爲了向後兼容;在Python 3中,舊式類被刪除。

+1

尼斯的答案。我會建議增加一些內容,比如「使用舊式課程的唯一理由是當你打電話進入一個古老的圖書館,要求你給它'實例'',但是你最後的編輯很好地覆蓋了。 – abarnert

0

這解釋了instance件事:

>>> class A(): pass; 
>>> A 
<class __main__.A at 0x7f879998b050> 
>>> A()            
<__main__.A instance at 0x7f87999a83b0> 

,但你不應該使用type()來比較蟒蛇反正對象,你應該使用isinstance()

1

用戶定義的類在Python中的原始實現被吸引。 2.2修正了它,但爲了向後兼容,它們必須保留舊系統。因此,Python有兩種類型,「經典」和「新風格」。任何從object(直接或間接)繼承的東西都是新式的;任何不是經典的。您編寫的每個類都應以某種方式從對象繼承,如果它沒有任何其他父項,則直接繼承,或者間接因爲它從另一個新樣式類(或內置類型)繼承而來。

http://python-history.blogspot.com/2010/06/new-style-classes.html