Definieren einer Python-Klasse mit vielen Attributen - style

8

Ich habe eine Klasse mit einer Anzahl von Attributen. Könnte jemand bitte die Unterschiede zwischen dem Setzen von Attributen wie a, b, c unten und x, y, z klären? Ich verstehe, dass, wenn Sie Argumente zu kommen, sie natürlich in der init sein müssen, nur für die Einstellung einer Anzahl von Standardvariablen, was ist vorzuziehen und was sind die Vor- und Nachteile.

%Vor%     
jbbiomed 13.09.2012, 00:08
quelle

4 Antworten

4
___ qstnhdr ___ Definieren einer Python-Klasse mit vielen Attributen - style ___ answer12397783 ___

Wie Sie sie deklariert haben, sind a, b und c verfügbar, ohne dass eine Instanz von Foo erstellt wird.
Zum Beispiel könnten Sie sagen:

%Vor%

Im Gegensatz dazu werden x, y und z erst erstellt, wenn Sie eine Instanz von Foo erstellen und diese für diese Instanz spezifisch sind:

%Vor%     
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123class ___ Eine Vorlage zum Erstellen neuer Objekte, die die allgemeinen Zustände und Verhaltensweisen beschreibt. NICHT MIT CSS-KLASSEN VERWECHSELN. Verwenden Sie stattdessen [css]. ___ antwort12397948 ___

Der Hauptkonflikt mit Klassenattributen zur Bereitstellung von Standardwerten für instanzspezifische Daten ist, dass die Standardwerte zwischen allen Instanzen der Klasse aufgeteilt werden, bis der Wert geändert wird. Zum Beispiel:

%Vor%

Das Folgende funktioniert jedoch wie erwartet:

%Vor%

Um dieses Problem zu vermeiden, sollten Sie bei der Verwendung dieser Technik nur Standardwerte verwenden, die unveränderliche -Werte sind. (Z. B. Zahlen, Strings, Tupel ...)

Der Grund, warum sich Python so verhält, ist der, wenn Sie mit folgenden Attributen auf ein Attribut zugreifen:

%Vor%

dann wird bar zuerst im Objekt foo gesucht. Wenn der Name nicht im Objekt gefunden wird (d. H. In foo.__dict__ ), wird der Name im Typ dieses Objekts nachgeschlagen. Zum Beispiel ist dieser Mechanismus Teil der Funktionsweise von Methoden-Lookups. (Wenn Sie sich das __dict__ eines Objekts ansehen, werden Sie bemerken, dass seine Methoden nicht vorhanden sind.)

Weitere kleinere Probleme bestehen darin, dass die Standardwerte über das type-Objekt verfügbar gemacht werden, wenn sie instanzspezifisch sein sollen. und dass es die Definitionen von klassenspezifischen Attributen (wie Konstanten) mischt, wenn Sie welche mit den Standardwerten haben. Die Folge davon ist, dass Sie später den Wert des Standards für alle Objekte neu definieren können, die den Wert noch nicht geändert haben, indem Sie dem Klassenattribut zuweisen. (Dies könnte nützlich oder verwirrend sein; es gilt die gleiche Vorsichtsmaßnahme gegenüber veränderlichen "globalen" Variablen.)

    
___ tag123styles ___ BENUTZEN SIE DIESEN TAG NICHT. Dieses Tag hat derzeit keine eindeutige Bedeutung. Es wird oft anstelle von oder in Verbindung mit [css] verwendet. Es wird auch bei Fragen zum Aussehen von Benutzeroberflächen und Fragen zur Formatierung des Quellcodes verwendet. ___ answer12397757 ___

Die Variablen %code% , %code% und %code% sind Klassenvariablen. Sie werden einmal bewertet und festgelegt, wenn die Klasse zum ersten Mal erstellt wird. Die Variablen %code% , %code% und %code% sind Instanzvariablen, die ausgewertet und gesetzt werden, wenn ein Objekt dieser Klasse instanziiert wird.

Im Allgemeinen verwenden Sie Klassenvariablen, wenn dieselben Werte von jeder Instanz der Klasse verwendet werden und nur einmal berechnet werden müssen. Sie verwenden Instanzvariablen für Variablen, die für jede Instanz dieser Klasse unterschiedlich sind.

Sie können auf Klassenvariablen über die Syntax der Instanzvariablen %code% zugreifen, aber das fragliche Objekt wird von allen Instanzen der Klasse gemeinsam genutzt. Dies wirkt sich nicht sehr auf die Verwendung unveränderlicher Datentypen wie Ganzzahlen oder Zeichenfolgen aus, aber bei Verwendung veränderlicher Datentypen wie Listen würde das Anhängen an %code% dazu führen, dass alle Instanzen den neu angehängten Wert sehen.

Einige Beispiele aus IDLE sind wahrscheinlich hilfreich, um dies zu verstehen:

%Vor%     
___ answer12397926 ___

Dies wurde unzählige Male gefragt ...

%code% sind Klassenvariablen, die von allen Instanzen gemeinsam genutzt werden. Eine gute Verwendung wäre ein Zähler, um alle Vorkommen dieser Klasse zu zählen, die erstellt wurden. %code% sind Instanzvariablen, die zu dieser einzelnen Instanz gehören und daher %code% verwenden. um sie einzustellen ...

Beachten Sie, dass Klassenvariablen wie %code% tatsächlich schattiert werden können. Dies ändert %code% nicht, sondern schattiert sie ... und hat ein paar Leute überrascht.

demo:

%Vor%     
___ qstntxt ___

Ich habe eine Klasse mit einer Anzahl von Attributen. Könnte jemand bitte die Unterschiede zwischen dem Setzen von Attributen wie a, b, c unten und x, y, z klären? Ich verstehe, dass, wenn Sie Argumente zu kommen, sie natürlich in der init sein müssen, nur für die Einstellung einer Anzahl von Standardvariablen, was ist vorzuziehen und was sind die Vor- und Nachteile.

%Vor%     
___
millimoose 13.09.2012, 00:43
quelle
7

Die Variablen a , b und c sind Klassenvariablen. Sie werden einmal bewertet und festgelegt, wenn die Klasse zum ersten Mal erstellt wird. Die Variablen x , y und z sind Instanzvariablen, die ausgewertet und gesetzt werden, wenn ein Objekt dieser Klasse instanziiert wird.

Im Allgemeinen verwenden Sie Klassenvariablen, wenn dieselben Werte von jeder Instanz der Klasse verwendet werden und nur einmal berechnet werden müssen. Sie verwenden Instanzvariablen für Variablen, die für jede Instanz dieser Klasse unterschiedlich sind.

Sie können auf Klassenvariablen über die Syntax der Instanzvariablen self.a zugreifen, aber das fragliche Objekt wird von allen Instanzen der Klasse gemeinsam genutzt. Dies wirkt sich nicht sehr auf die Verwendung unveränderlicher Datentypen wie Ganzzahlen oder Zeichenfolgen aus, aber bei Verwendung veränderlicher Datentypen wie Listen würde das Anhängen an self.a dazu führen, dass alle Instanzen den neu angehängten Wert sehen.

Einige Beispiele aus IDLE sind wahrscheinlich hilfreich, um dies zu verstehen:

%Vor%     
Joe C. 13.09.2012 00:15
quelle
2

Wie Sie sie deklariert haben, sind a, b und c verfügbar, ohne dass eine Instanz von Foo erstellt wird.
Zum Beispiel könnten Sie sagen:

%Vor%

Im Gegensatz dazu werden x, y und z erst erstellt, wenn Sie eine Instanz von Foo erstellen und diese für diese Instanz spezifisch sind:

%Vor%     
dckrooney 13.09.2012 00:19
quelle
1

Dies wurde unzählige Male gefragt ...

a,b,c sind Klassenvariablen, die von allen Instanzen gemeinsam genutzt werden. Eine gute Verwendung wäre ein Zähler, um alle Vorkommen dieser Klasse zu zählen, die erstellt wurden. x,y,z sind Instanzvariablen, die zu dieser einzelnen Instanz gehören und daher self verwenden. um sie einzustellen ...

Beachten Sie, dass Klassenvariablen wie self.a = 3 tatsächlich schattiert werden können. Dies ändert a nicht, sondern schattiert sie ... und hat ein paar Leute überrascht.

demo:

%Vor%     
Samy Vilar 13.09.2012 00:39
quelle

Tags und Links