Frage

Während der Beantwortung statische Klassenvariablen in Python

Ich habe bemerkt, dass PythonWin PyWin32 209,2 Dolmetscher bauen scheint zweimal zu bewerten?

PythonWin 2.5 (r25:51908, Mar  9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2006 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> class X:
...     l = []
...     def __init__(self):
...         self.__class__.l.append(1)
...         
>>> X().l
[1, 1]
>>> 

, während der Python-Interpreter das Richtige tut

C:\>python
ActivePython 2.5.0.0 (ActiveState Software Inc.) based on
Python 2.5 (r25:51908, Mar  9 2007, 17:40:28) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
...   l = []
...   def __init__(self):
...     self.__class__.l.append(1)
...
>>> X().l
[1]
>>>
War es hilfreich?

Lösung

Meine Vermutung ist, wie folgt. Der PythonWin Editor bietet die automatische Vervollständigung für ein Objekt, das heißt, wenn Sie myobject. gibt es bietet ein kleines Pop-up aller Availble Methodennamen. Ich denke also, wenn Sie X(). gibt es eine Instanz von X im Hintergrund zu schaffen und ein dir oder ähnliches zu tun, um die Attribute des Objekts zu ermitteln.

So wird der Konstruktor nur ausgeführt werden einmal für jedes Objekt aber die Interaktivität zu geben, es Objekte still im Hintergrund zu schaffen, ohne Sie darüber zu erzählen.

Andere Tipps

Dave Webb ist richtig, und Sie können sehen, durch eine print-Anweisung hinzufügen:

>>> class X:
...     l = []
...     def __init__(self):
...             print 'inited'
...             self.__class__.l.append(1)
...             

Dann, sobald Sie die Zeit in X(). geben druckt inited vor Ihnen die Fertigstellung Pop-up anbieten zu können.

Zwei kleine zusätzliche Punkte.

Als erstes self.__class__.l.append(1) ist nicht wirklich sinnvoll.

Just sagen self.l.append(1). Python sucht die Instanz, bevor er die Klasse für die Referenzsucht.

Noch wichtiger ist, Klasse-Ebene Variablen sind selten nützlich. Klasse-Ebene Konstanten sind manchmal sinnvoll, aber auch dann, sie sind schwer zu rechtfertigen.

In C ++ und Java, auf Klassenebene ( ‚static‘) Variablen scheint praktisch, aber nicht viel von Wert tun. Sie sind schwer zu n00bz lehren - oft viel Unterrichtszeit auf Minutien verschwenden - und sie sind nicht sehr praktisch. Wenn Sie alle Instanzen eines X erfahren möchten, die erstellt wurde, ist es wahrscheinlich besser, eine Xfactory Klasse zu erstellen, die nicht auf Klassenvariablen angewiesen ist.

class XFactory( object ):
    def __init__( self ):
        self.listOfX= []
    def makeX( self, *args, **kw ):
        newX= X(*args,**kw)
        self.listOfX.append(newX)
        return newX

Keine Variable auf Klassenebene Anomalien. Und ist es nicht das X mit der Sammlung von X conflate. Auf lange Sicht finde ich es verwirrend, wenn eine Klasse sowohl ein Ding und auch einige Sammlung von Dingen ist.

Simpler ist besser als Complex.

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