Python - Difference between class and instance attributes

Today I am going to explain the Difference between class and instance attributes

Is there any meaningful distinction between:

            class A(object):
               foo = 5   # some default value
             
vs.

            class B(object):
               def __init__(self, foo=5):
                   self.foo = foo
                 

If you're creating a lot of instances, is there any difference in performance or space requirements for the two styles? When you read the code, do you consider the meaning of the two styles to be significantly different?
/
The difference is that the attribute on the class is shared by all instances. The attribute on an instance is unique to that instance.

If coming from C++, attributes on the class are more like static member variables.

Beyond performance considerations, there is a significant semantic difference. In the class attribute case, there is just one object referred to. In the instance-attribute-set-at-instantiation, there can be multiple objects referred to. For instance


            
            >>> class A: foo = []
            >>> a, b = A(), A()
            >>> a.foo.append(5)
            >>> b.foo
            [5]
            >>> class A:
            ...  def __init__(self): self.foo = []
            >>> a, b = A(), A()
            >>> a.foo.append(5)
            >>> b.foo
            []
            

Leave a comment