2013-06-04 74 views
0

使用()和不使用括號創建對象實例的區別?使用圓括號創建對象python

假設這是我的簡單的類:

class ilist(list): 
    t1 = "Test1" 
    t2 = "Test2" 

與製作實例來此兩個變量:

list1 = ilist() 
list2 = ilist 

當打印兩個實例

>>> list1 
[] 
>>> list2 
<class '__main__.ilist'> 

我可以成功訪問他們的屬性

>>> list1.test1 
'Test1' 
>>> list2.test1 
'Test1' 

,它體現在使用的方法列表2錯誤追加

>>> list1.append("Item1") 
>>> list2.append("Item1") 
Traceback (most recent call last): 
File "<pyshell#64>", line 1, in <module> 
list2.append("Item1") 
TypeError: descriptor 'append' requires a 'list' object but received a 'str' 

是什麼,不僅在這個簡單的例子有什麼區別?

+0

只有其中一個創建實例, – jamylak

回答

7

list1 = ilist()創建該類的一個對象。 list2 = ilist對類本身作了參考。類是Python中的第一類對象,這意味着它們可以像任何其他對象一樣分配。

因爲屬性是類的一部分,所以它們也是使用該類創建的對象的一部分。

2

當您不在調用該類(省略())時,您並未創建實例。您正在創建的另一個參考。 ()調用一個類來產生一個實例。

您的list2變量僅僅是對您的ilist類對象的引用。該類對象具有t1t1屬性,因此您可以引用這些屬性。但是隻有list1是一個實際的實例,通過調用該類生成。

當在實例上查找屬性時,該類請參考以及。所以list1不具有t1t2屬性,但其類別確實是

您可能想再次諮詢Python tutorial on classes以查看類和實例之間的區別。

2

您在第二個示例中未創建對象的實例。您只需將類ilist分配給名爲list2的變量,這就是爲什麼repr(list)會輸出其類名稱的原因。

0

(幾乎)一切都是在python一個對象,所以list1 = ilist()是類型的對象ilistilistlist2 = ilisttype

1

爲了解釋實際的錯誤消息類型的對象:同樣的方法被稱爲第二例如,但方法應該收到self作爲他們的第一個參數。如果您使用實例進行調用,它將作爲第一個參數傳遞;但是在這裏你使用的是類,所以它應該被明確地傳遞。

您通過"Item1"作爲第一個參數,但這是一個字符串,而不是ilist