The best answers to the question “correct way to define class variables in Python [duplicate]” in the category Dev.
I noticed that in Python, people initialize their class attributes in two different ways.
The first way is like this:
class MyClass: __element1 = 123 __element2 = "this is Africa" def __init__(self): #pass or something else
The other style looks like:
class MyClass: def __init__(self): self.__element1 = 123 self.__element2 = "this is Africa"
Which is the correct way to initialize class attributes?
I think this sample explains the difference between the styles:
[email protected]:~$cat test.py #!/usr/bin/env python class MyClass: element1 = "Hello" def __init__(self): self.element2 = "World" obj = MyClass() print dir(MyClass) print "--" print dir(obj) print "--" print obj.element1 print obj.element2 print MyClass.element1 + " " + MyClass.element2 [email protected]:~$./test.py ['__doc__', '__init__', '__module__', 'element1'] -- ['__doc__', '__init__', '__module__', 'element1', 'element2'] -- Hello World Hello Traceback (most recent call last): File "./test.py", line 17, in <module> print MyClass.element2 AttributeError: class MyClass has no attribute 'element2'
element1 is bound to the class, element2 is bound to an instance of the class.
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.