Python-Klasse-Attribute und deren Initialisierung

Ich bin ganz neu in Python und in diesen Tagen erforsche ich Klassen. Ich habe eine Frage zu Attributen und Variablen innerhalb der Klassen: Was ist der Unterschied zwischen der Definition eines Attributs über nur q=1 im Körper der Klasse und über die Definition von self.q=1 innerhalb der __init__ ? Zum Beispiel, was ist der Unterschied zwischen den beiden folgenden Möglichkeiten?

 class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x 

und

 class MyClass2: def __init__(self,p): self.q=1 self.p=p def AddSomething(self,x): self.q = self.q+x 

Die Ausgabe von zB:

 >>> my=MyClass1(2) >>> my.p 2 >>> my.q 1 >>> my.AddSomething(7) >>> my.q 8 

MyClass1 nicht davon ab, ob MyClass1 oder MyClass2 verwendet wird. Weder in MyClass1 noch in MyClass2 tritt ein Fehler auf.

3 Solutions collect form web for “Python-Klasse-Attribute und deren Initialisierung”

Klassen sowie ihre Instanzen in python verwendet Wörterbuch wie Datenstruktur, um die Informationen zu speichern.

Für jede Klassendefinition wird also ein Wörterbuch zugewiesen, in dem die Klassenstufeninformationen (Klassenvariablen) gespeichert werden. Und für jede Instanz dieser bestimmten Klasse wird ein eigenes Wörterbuch (self) zugewiesen, wo die instanzspezifischen Informationen (Instanzvariablen) gespeichert werden.

Also jetzt die nächste Frage ist: Wie wird die Suche nach einem bestimmten Namen durchgeführt?

Und auf diese Frage zu antworten ist, dass, wenn man auf die Namen durch irgendeine Instanz zugreift, das instanzspezifische Wörterbuch zuerst gesucht wird und wenn der Name dort nicht gefunden wird, dann wird das Klassenwörterbuch nach diesem Namen gesucht. Wenn also der gleiche Wert auf beiden Ebenen definiert ist, wird der vorherige überschrieben.

Beachten Sie, dass beim Schreiben von d ['key'] = val, wo d ein Wörterbuch ist, wird 'key' automatisch dem Wörterbuch hinzugefügt, wenn nicht bereits vorhanden. Andernfalls wird der aktuelle Wert überschrieben. Denken Sie daran, bevor Sie die weitere Erklärung lesen.

Jetzt lass uns durch den Code gehen, den du benutzt hast, um dein Problem zu beschreiben:

MyClass1

 class MyClass1: q=1 def __init__(self,p): self.p=p def AddSomething(self,x): self.q = self.q+x 

 1. my = Myclass1(2) #create new instance and add variables to it. MyClass = {"q" : 1} my = {"p" : 2} 

 2. my.p # =2, p will be taken from Dictionary of my-instance. 

 3. my.q # =1, q will be takn from MyClass dict. (Not present in dictionary of my-instance). 

 4. my.AddSomething(7) # This method access the value of q (using self.q) first # which is not defined in my dict and hence will be taken # from dictionary of MyClass. After the addition operation, # the sum is being stored in self.q. Note that now we are # adding the name q to Dictionary of my-instance and hence # a new memory space will be created in Dictionary of my-instance # and the future references to self.q will fetch the value # of self.q from dictionary of my-instance. MyClass = {"q" : 1} my = {"p" : 2, "q" : 8} 

 5. my.q # =8, q now is available in dictionary of my-instance. 

Der signifikanteste Unterschied zwischen dem q Attribut in diesen Klassen ist, dass bei der MyClass1 Implementierung die Variable über alle Instanzen dieser Klasse MyClass2 , während in MyClass2 nur im Bereich dieses Objekts sichtbar ist.

Einige docs: https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

q=1 innerhalb der Klasse ist ein Klassenattribut, das mit der Klasse als Ganzes und nicht mit einer bestimmten Instanz der Klasse assoziiert ist. Es ist am deutlichsten mit der Klasse selbst MyClass1.q : MyClass1.q .

Ein __init__ wird direkt einer Instanz einer Klasse zugeordnet, in der Regel in __init__ durch Zuweisung an sich self ( self.p = p mit self.p = p ), aber du kannst jederzeit einer Instanz Attribute zuordnen.

Klassenattribute können entweder mit der Klassenbindung ( MyClass.q ) oder einer MyClass.q gelesen werden ( my.q , vorausgesetzt, es wird nicht durch ein my.q mit demselben Namen beschattet). Sie können jedoch nur mit einer Klassenbindung eingestellt werden. Wenn Sie einen Wert mit einer Instanzbindung festlegen, wird immer ein Instanzattribut geändert. Betrachten Sie dieses Beispiel:

 >>> a = MyClass1() >>> aq 1 >>> aq = 3 # Create an instance attribute that shadows the class attribute 3 >>> MyClass1.q 1 >>> b = MyClass1() >>> bq # b doesn't have an instance attribute q, so access the class's 1 
Python ist die beste Programmiersprache der Welt.