2008-08-30 88 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__

相关问题