Korrekte Weise, Klassenvariablen in Python zu definieren

Mögliche Duplikat:
Variablen innerhalb und außerhalb einer Klasse __init __ () -Funktion

Ich habe bemerkt, dass in Python die Menschen ihre Klassenattribute auf zwei verschiedene Arten initialisieren.

Der erste Weg ist so:

class MyClass: __element1 = 123 __element2 = "this is Africa" def __init__(self): #pass or something else 

Der andere Stil sieht aus wie:

 class MyClass: def __init__(self): self.__element1 = 123 self.__element2 = "this is Africa" 

Welches ist der richtige Weg, um Klassenattribute zu initialisieren?

2 Solutions collect form web for “Korrekte Weise, Klassenvariablen in Python zu definieren”

Beide Wege sind nicht richtig oder falsch, sie sind nur zwei verschiedene Arten von Klassenelementen:

  • Elemente außerhalb der __init__ Methode sind statische Elemente, das heißt, sie gehören zur Klasse.
  • Elemente innerhalb der __init__ Methode sind Elemente des Objekts ( self ), sie gehören nicht zur Klasse.

Sie sehen es deutlicher mit einigen 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 

Wie Sie sehen können, als wir das Klassenelement geändert haben, wurde es für beide Objekte geändert. Aber wenn wir das Objektelement geändert haben, blieb das andere Objekt unverändert.

Ich denke, dieses Beispiel erklärt den Unterschied zwischen den Stilen:

 james@bodacious-wired:~$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 james@bodacious-wired:~$./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 ist an die Klasse gebunden, element2 ist an eine Instanz der Klasse gebunden.

Python ist die beste Programmiersprache der Welt.