Neither way is necessarily correct or incorrect, they are just two different kinds of class elements:
- Elements outside the
__init__method are static elements; they belong to the class.
- Elements inside the
__init__method are elements of the object (
self); they don't belong to the class.
You'll see it more clearly with some code:
class MyClass: static_elem = 123 def __init__(self): self.object_elem = 456 c1 = MyClass() c2 = MyClass() # Initial values of both elements >>> print c1.static_elem, c1.object_elem 123 456 >>> print c2.static_elem, c2.object_elem 123 456 # Nothing new so far ... # Let's try changing the static element MyClass.static_elem = 999 >>> print c1.static_elem, c1.object_elem 999 456 >>> print c2.static_elem, c2.object_elem 999 456 # Now, let's try changing the object element c1.object_elem = 888 >>> print c1.static_elem, c1.object_elem 999 888 >>> print c2.static_elem, c2.object_elem 999 456
As you can see, when we changed the class element, it changed for both objects. But, when we changed the object element, the other object remained unchanged.