Die Definition von Variablen in der Klassendefinition macht die Variable für jede Instanz der Klasse zugänglich. In Java ausgedrückt heißt das ein bisschen wie wodurch die Variable statisch wird. Es gibt jedoch wesentliche Unterschiede, wie unten gezeigt wird.
class MyClass(object):
msg = "ABC"
print MyClass.msg #prints ABC
a = MyClass()
print a.msg #prints ABC
a.msg = "abc"
print a.msg #prints abc
print MyClass.msg #prints ABC
print a.__class__.msg #prints ABC
Wie aus dem obigen Code ersichtlich, ist es nicht ganz dasselbe, da die Variable zwar über self.msg
Wenn ihr ein Wert zugewiesen wird, wird dieser nicht der im Klassenbereich definierten Variablen zugewiesen.
Einer der Nachteile der Methode, die Sie verwenden, ist, dass sie zu Fehlern führen kann, da sie der Klasse versteckte Zustände hinzufügt. Angenommen, jemand vergisst self.msg = "ABC"
aus dem Konstruktor (oder, realistischer, der Code wurde überarbeitet und nur eine der Definitionen wurde geändert)
a = MyClass()
print a.msg #prints ABC
#somewhere else in the program
MyClass.msg = "XYZ"
#now the same bit of code leads to a different result, despite the expectation that it
#leads to the same result.
a = MyClass()
print a.msg #prints XYZ
Es ist weitaus besser, die Definition von msg auf Klassenebene zu vermeiden, um die Probleme zu umgehen:
class MyClass(object):
pass
print MyClass.msg #AttributeError: type object 'MyClass' has no attribute 'msg'