2008-08-30 86 views
30

如果我創建一個類A如下:爲什麼我的實例變量不在__dict__中?

class A: 
    def __init__(self): 
     self.name = 'A' 

檢查的__dict__成員看起來像{'name': 'A'}

然而,如果我創建一個類B

class B: 
    name = 'B' 

__dict__是空的。

是什麼兩者之間的區別,以及爲什麼在B__dict__name顯示出來?

回答

42

B.name是一個類屬性,而不是一個實例屬性。它出現在B.__dict__,但不在b = B(); b.__dict__

這個區別在某種程度上被掩蓋了,因爲當你訪問一個實例的屬性時,類字典是一個後備。所以在上面的例子中,b.name會給你B.name的值。

11
class A: 
    def _ _init_ _(self): 
     self.name = 'A' 
a = A() 

創建對類型A的對象實例的一個屬性,它因此可以找到:a.__dict__

class B: 
    name = 'B' 
b = B() 

創建在B類的屬性和屬性可以在B.__dict__替代地發現如果您有B類型的實例b,您可以在b.__class__.__dict__

相關問題