Frage

class Ball:
  a = []
  def __init__(self):
    pass

  def add(self,thing):
    self.a.append(thing)

  def size(self):
    print len(self.a)

for i in range(3):
  foo = Ball()
  foo.add(1)
  foo.add(2)
  foo.size()

Ich würde erwarten, eine Rendite von:

2
2
2

Aber ich bekomme:

2
4
6

Warum ist das? Ich habe festgestellt, dass, indem Sie a = [] in der init , kann ich Route, um dieses Verhalten, aber ich bin weniger als klar, warum.

War es hilfreich?

Lösung

doh

Ich habe gerade herausgefunden, warum.

Im obigen Fall, der eine ist ein Klasse-Attribut, kein Datenattribut - diese werden von allen Kugeln geteilt (). Kommentiert aus dem a = [] und in den init Block platzieren bedeutet, dass es stattdessen ein Datenattribut ist. (Und ich konnte es nicht dann Zugriff mit foo.a, die ich sowieso nicht tun sollten.) Es scheint, wie die Klassenattribute wie statische Attribute der Klasse handeln, sind sie von allen Instanzen gemeinsam genutzt.

Whoa.

Eine Frage aber: Autovervollständigung wie dies saugt. In der Foo-Klasse, kann ich selbst nicht (variabel), da er nicht automatisch definiert ist wird -. Es durch eine Funktion definiert ist wird. Kann ich eine Klassenvariable definieren und mit einer Datenvariablen ersetzen?

Andere Tipps

Was möchten Sie wahrscheinlich zu tun ist:

class Ball:
  def __init__(self):
    self.a = []

Wenn Sie nur a = [] verwenden, erstellt es eine lokale Variable in der __init__ Funktion, die, wenn die Funktion zurückkehrt verschwindet. Zuordnen zu self.a macht es eine Instanzvariable das ist, was Sie nach.

Für eine halbbezogenen gotcha, sehen Sie, wie Sie das ändern Wert des Standardparameters für zukünftige Anrufer .

„Kann ich definieren eine Klassenvariable und ersetzen sie durch eine Datenvariable?“

Nein. Sie sind verschiedene Dinge. Eine Klassenvariable existiert genau einmal -. In der Klasse

Sie könnten - auf Code-Vervollständigung Finesse - beginnen mit einigen Klassenvariablen und dann diese Zeilen Code löschen, nachdem Sie Ihre Klasse geschrieben haben. Aber jedes Mal, wenn Sie vergessen, dass nichts Gutes passieren wird.

Es ist besser, eine andere IDE zu versuchen. Komodo Edit 's Code Fertig scheint vernünftig zu sein.

Wenn Sie so viele Variablen mit so langen Namen haben, die Code-Vervollständigung wirklich hilfreich ist, sollten Sie vielleicht Ihre Klassen zu verkleinern oder kürzeren Namen verwenden. Ernsthaft.

Ich finde, dass, wenn Sie an einen Ort, wo der Code-Vervollständigung hilfreicher als ärgerlich, Sie das „halten alles in meinem Gehirn“ Komplexitätsschwelle überschritten haben. Wenn die Klasse wird mein Gehirn nicht passen, es ist zu komplex.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top