tags:

views:

528

answers:

2

If I create a class A as follows:

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

Inspecting the _ _dict_ _ member looks like {'name': 'A'}

If however I create a class B:

class B:
    name = 'B'

_ _dict_ _ is empty.

What is the difference between the two, and why doesn't name show up in B's _ _dict_ _?

+21  A: 

B.name is a class attribute, not an instance attribute. It shows up in B.__dict__, but not in b = B(); b.__dict__.

The distinction is obscured somewhat because when you access an attribute on an instance, the class dict is a fallback. So in the above example, b.name will give you the value of B.name.

Carl Meyer
+4  A: 
class A:
    def _ _init_ _(self):
        self.name = 'A'
a = A()

Creates an attribute on the object instance a of type A and it can therefore be found in: a.__dict__

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

Creates an attribute on the class B and the attribute can be found in B.__dict__ alternatively if you have an instance b of type B you can see the class level attributes in b.__class__.__dict__

Tendayi Mawushe