2013-09-25 30 views
3
class Foo: 
    bar = 1 
    ......etc. 

我知道,當創建一個實例,酒吧創建__init__之前, 我想知道這是否是創造 Foo的一個實例時創建欄屬性的第一件事。 此外,在任何實例創建之前,條形圖是否已經存在於內存中?當是Python類屬性創建

+1

http://docs.python.org/2/reference/datamodel.html通常值得閱讀,當涉及到這樣的事情。 – ThiefMaster

回答

6

請記住,在Python class是一個可執行語句(如太是defimport)。因此,在回答你的問題是,class語句執行時bar創建。

具體來說,class語句執行的時候,班裏的身體的命名空間中,通常只是一個dict。在執行時,身體已經結束執行一個類對象的時候會產生一個dict的副本,作爲__dict__屬性的c姑娘。 此處的字典包含所有在類主體bar=1內部綁定的名稱,但也包含在類體中定義的所有函數。

實例在創建時不會獲得bar的副本,只會引用該類。在實例上查找名稱時,Python會在實例的__dict__和該類的__dict__中查找。

+0

對我來說是一個完美的答案。謝謝鄧肯 –

0

這些屬性存儲在類本身的__dict__中。他們從來沒有存在於實例(或者實例的__dict__)上,除非您手動分配它。

例如,如果你在一個方法使用self.bar += 1從類級變量讀1並分配2的實例級變量。下次運行此語句時,實例級別上存在bar,因此您讀取了2並將其替換爲3

+0

那麼,我主要好奇,當酒吧財產了內存,在任何實例創建之前? –

+0

當然,這是班上的一部分。 – ThiefMaster

0

狀態變量將在構造函數之前分配(初始值)。所以...

Class Foo: 
     bar = 1 
     def __init__(self): 
      bartwo = 2 

雖然在bartwo被分配之前,會看到bar取值爲1。我的猜測是你的問題是:「如果我一個構造函數之前指定一個狀態變量,我可以用它在構造函數中。是的。