correct way to define class variables in Python [duplicate] correct way to define class variables in Python [duplicate] python python

correct way to define class variables in Python [duplicate]


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 = 456c1 = MyClass()c2 = MyClass()# Initial values of both elements>>> print c1.static_elem, c1.object_elem 123 456>>> print c2.static_elem, c2.object_elem123 456# Nothing new so far ...# Let's try changing the static elementMyClass.static_elem = 999>>> print c1.static_elem, c1.object_elem999 456>>> print c2.static_elem, c2.object_elem999 456# Now, let's try changing the object elementc1.object_elem = 888>>> print c1.static_elem, c1.object_elem999 888>>> print c2.static_elem, c2.object_elem999 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.


I think this sample explains the difference between the styles:

james@bodacious-wired:~$cat test.py #!/usr/bin/env pythonclass MyClass:    element1 = "Hello"    def __init__(self):        self.element2 = "World"obj = MyClass()print dir(MyClass)print "--"print dir(obj)print "--"print obj.element1 print obj.element2print MyClass.element1 + " " + MyClass.element2james@bodacious-wired:~$./test.py ['__doc__', '__init__', '__module__', 'element1']--['__doc__', '__init__', '__module__', 'element1', 'element2']--Hello WorldHelloTraceback (most recent call last):  File "./test.py", line 17, in <module>    print MyClass.element2AttributeError: class MyClass has no attribute 'element2'

element1 is bound to the class, element2 is bound to an instance of the class.