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.