2014-12-03 39 views
0

我稍微這個程序的輸出困惑:理解實例變量

class Test(object): 
    a = None 
    b = None 

    def __init__(self, a): 
     print self.a 
     self.a = a 
     self._x = 123; 
     self.__y = 123; 
     b = 'meow' 

輸出以下行有什麼讓我困惑:

instance = Test(3) #Output is None 
print Test.a #Output is None 
print instance.a #Output is 3. Why does this print 3? 

我跟爲什麼print Instance.a掙扎打印3和其他兩行不。

感謝

回答

0
instance = Test(3) #Output is None 

這是沒有的,因爲你打印self.a已分配之前。

print Test.a #Output is None 

這是無B,因爲要打印在類,其尚未被初始化尚未所以只有在類定義的一個=無已處理完畢。

print instance.a #Output is 3. Why does this print 3? 

此打印3,因爲你是在你第一次調用創建的Test類的實例調用它。 __init__已運行,並修改self.a爲您提供的3(這是從上面不同的,因爲調用Test.a,該__init__方法不叫,所以你從類定義

0

通常一個讓您的作業寫小寫情況下(我固定它)

爲了閱讀你的程序

  • 進入初始化
    • 我應該在打印self.a:。
      • 當前實例是否具有a屬性?沒有。
      • 好的,看看類型。
      • Test通常具有a屬性嗎?是的,這是None
      • 確定,打印None
    • 設置self.a3
      • 這個實例是否有a屬性?沒有。
      • 確定創建它並將其值設爲3
  • 什麼默認aTest對象?它沒有。打印它。
  • 這個實例的值爲a?它是3.

舉一個更人性化的例子。

通常不知名的人被命名爲John Doe。

有人無意識上午8點進入醫院。他的名字是什麼? (不知道,讓我們寫「John Doe」吧)

進入8的人的名字是什麼? 「John Doe」

他醒了,嘿你叫什麼名字?我是Bob

以8輸入的人的姓名是什麼? 「Bob」

當有人昏迷進入醫院時,他叫什麼名字? 「John Doe」(沒有改變爲「Bob」)

如果另一個病人進入,她的Id是「Alice」,她叫什麼名字?可能是「愛麗絲」