2010-12-18 63 views
14

我對Python中的類型和類有點困惑。對於例如以下REPL談話讓我困惑:Python中的類型和類

>>> class A: pass 
... 
>>> a = A() 
>>> type(a) 
<type 'instance'> 
>>> a.__class__ 
<class __main__.A at 0xb770756c> 
>>> type([]) 
<type 'list'> 
>>> [].__class__ 
<type 'list'> 
>>> type(list) 
<type 'type'> 
>>> list.__class__ 
<type 'type'> 
>>> type(A) 
<type 'classobj'> 
>>> A.__class__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: class A has no attribute '__class__' 
  1. 爲什麼是內在的東西的類型和種類(例如在此列出)相同,但對於用戶類/類型的不同?
  2. 是不是每個類都是某個其他類的實例(如Java中的Class)?爲什麼沒有__class__用戶定義類?

任何解釋/進一步閱讀可以澄清這種行爲將不勝感激。 TIA。

+4

你應該用'class A(object)'定義你的類。然後你會得到''。 – 2010-12-18 19:50:33

回答

13

您遇到新風格類與經典類的不同行爲。爲進一步閱讀閱讀:Python Data Model。具體閱讀類和新風格與經典類的區別。

嘗試鍵入以下到您的REPL:

class A: pass 
class B(object): pass 

,你會看到你得到不同的結果。在這裏,您正在處理新風格和舊風格類別之間的區別。使用Python 2.6.1這裏是我得到的:

> type(A) 
<type "classobj"> 
> type(B) 
<type "type"> 

它告訴你列表是新的樣式類而不是舊的樣式類。我們可以進一步發揮各地使用list的東西,以及:

> type(list) 
<type "type"> 

同我們class B(object): pass結果。而且還

> c = [] 
> type(c) 
<type "list"> 

這是告訴你關於對象的實例,而不是它的定義。

+0

看來我的錯誤是沒有使用新的類型結果給了我奇怪的結果(當然是爲了向後兼容)。鏈接看起來很有趣。謝謝。 – sasuke 2010-12-18 19:59:50

4

這是「惡果的原因」。或者可能的「Histerical」。這一切都固定在Python 3:

>>> class A: pass 
... 
>>> a = A() 
>>> type(a) 
<class '__main__.A'> 
>>> a.__class__ 
<class '__main__.A'> 
>>> type([]) 
<class 'list'> 
>>> [].__class__ 
<class 'list'> 
>>> type(list) 
<class 'type'> 
>>> list.__class__ 
<class 'type'> 
>>> type(A) 
<class 'type'> 
>>> A.__class__ 
<class 'type'> 
>>> class B(object): pass 
... 
>>> type(B) 
<class 'type'> 
>>> b = B() 
>>> type(b) 
<class '__main__.B'> 
+0

很高興知道。沒有意識到Python 3已經解決了所有問題。那麼我假設,所有的類不管明確地從'object'派生出來,然後從'object'派生出來? – wheaties 2010-12-18 20:04:55

+0

這是正確的理解。 – 2010-12-18 20:07:22

1

在Python 3.0,用戶定義的類對象是已命名的類型的對象, ,其本身就是一個類的實例。 •在Python 2.6中,新式類繼承自object,它是類型的子類; •經典類是類型的實例,不是從類創建的。