2012-02-13 76 views
0

所以我正在學習類。爲什麼我不能使用第三塊代碼來做與第二塊代碼顯然相同的事情?爲什麼我必須將p1分配給person(),而不是像我在第三塊代碼中那樣使用person()python中的類,變量混淆

#class 
class person: 
def asdf(self): 
    self.firstname="" 
    self.lastname="" 
    self.id="" 
    self.email="" 
    self.friends=[] 

#second block of code 

p1 = person() 
p1.firstname="Dave" 
p1.lastname="Johnson" 
p1.id="2345239" 
p1.email="[email protected]" 
print p1.firstname 

#third block of code 

person().firstname="Dave" 
person().lastname="Johnson" 
person().id="2345239" 
person().email="[email protected]" 
print person().firstname 
+1

我認爲你需要重新閱讀你正在學習的任何教程。 – 2012-02-13 20:53:25

回答

5

在第二個塊中,更改同一實例的屬性。

p1 = person()    # create new instance 
p1.firstname="Dave"   # change its first name 
p1.lastname="Johnson"  # change its last name 
# ... 
print p1.firstname   # access its firstname 

在第三個塊中,您在每一行中創建一個新實例。

person().firstname="Dave"  # create new instance and change its firstname 
person().lastname="Johnson" # create new instance and change its lastname 
# ... 
print person().firstname  # create new instance and access its firstname 

更準確,問題只發生在最後一行,當你試圖訪問尚未宣佈的attirbute,因爲firstname屬性只在功能asdf聲明,或在第二塊,在所述線p1.firstname="Dave"

下面是一個簡單的例子:

>>> class A: 
...  def AA(self): 
...   self.a = 1 
... 
>>> a = A() 
>>> a.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'a' 
>>> a.a = 1 
>>> a.a 
1 
+0

因此,在第二個代碼塊中,p1成爲第一行中的新實例,然後在後面的行中進行更改。但在第三部分中,我正在每行創建新實例,並使用名字或姓氏等更改來更改每個單獨的實例。我收到的錯誤消息說'實例沒有屬性... ...因此,創建p1作爲person()的一個實例告訴python它具有這些屬性,比如firstname?我不確定一個屬性究竟是什麼。 – ZCJ 2012-02-13 20:21:28

+0

屬性就是你要分配的東西。如果'p1'是一個'person',那麼'p1.firstname'就是'person'的'firstname'屬性。你不「創建p1作爲人的實例()」;你將新創建的'person'類的實例(這是'person()'創建的)賦給變量'p1'。您從第三個塊獲得錯誤消息,因爲您正在檢查的'firstname'的'person'與您分配的'firstname'的'person'不同。當你設置'p1'的'firstname',然後再檢查'p1'的'firstname'時,這兩個地方顯然是同一個'人'。 – 2012-02-13 20:53:00

3

在代碼的第三塊,每次調用person()創建person℃的新實例姑娘。代碼然後設置該對象的屬性值,然後丟棄整個對象,因爲它不存儲在任何變量中。

1

僅供參考,python風格是在類上使用駱駝案例。這是問題的一部分。初始上限有助於區分類構造和方法調用。

定義一個類:

class Person(object): 
    def asdf(self): 
     self.firstname="" 
     self.lastname="" 
     self.id="" 
     self.email="" 
     self.friends=[] 

製作實例:

p = Person() 

使用類名稱,如函數調用構造一個實例,使用類作爲原型。在第二個塊中,您創建了一個實例,並且您正在更改其屬性。

在第三個塊中,您創建了四個人的新實例,在它們上設置了一個屬性,並將它們丟棄(因爲它們沒有分配給任何東西)。

在類中的書面記錄確實是值得一讀: http://docs.python.org/tutorial/classes.html

有底層的實現,你並不需要一個公平的,但也有關於類,實例和屬性的一些關鍵細節。

+0

很酷,感謝您的鏈接。我剛剛開始了這個東西。有關資本化的有趣說明;這似乎不是必要的,但我可以看到自己以後犯的錯誤不是作爲提示什麼「人」所指的。 – ZCJ 2012-02-13 20:30:47