3

Pythonで静的クラス変数に答えながら

PythonWin PyWin32 ビルド 209.2 インタープリターが 2 回評価されるように見えることに気付きましたか?

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]
>>> 

Pythonインタープリターが正しいことをしている間

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]
>>>
4

3 に答える 3

3

私の推測は次のとおりです。PythonWinエディターは、オブジェクトのオートコンプリートを提供します。つまり、入力myobject.すると、使用可能なすべてのメソッド名の小さなポップアップが表示されます。したがって、入力すると、バックグラウンドでX().のインスタンスが作成され、オブジェクトの属性を見つけるためにまたは同様の処理が行われると思います。Xdir

したがって、コンストラクターはオブジェクトごとに1回だけ実行されますが、対話性を提供するために、コンストラクターは、オブジェクトについて通知することなく、バックグラウンドでサイレントにオブジェクトを作成します。

于 2008-09-17T08:57:41.313 に答える
2

Dave Webbは正しいです。これは、printステートメントを追加することで確認できます。

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

次に、ピリオドを入力するとすぐに、完了ポップアップが表示される前にX().印刷されます。inited

于 2008-09-17T15:08:22.247 に答える
1

2 つの小さな追加ポイント。

まず、self.__class__.l.append(1)本当に賢明ではありません。

ただ言ってself.l.append(1)ください。Python は、クラスで参照を検索する前にインスタンスを検索します。

さらに重要なことは、クラスレベルの変数がほとんど役に立たないことです。クラス レベルの定数は適切な場合もありますが、それでも正当化するのは困難です。

C++ と Java では、クラス レベル (' static') 変数は便利なように見えますが、あまり価値はありません。それらを n00bz に教えるのは難しく、多くの場合、教室での多くの時間を細かい点で無駄にしています。また、あまり実用的ではありません。作成された X のすべてのインスタンスを知りたい場合は、クラス変数に依存しない XFactory クラスを作成することをお勧めします。

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

クラスレベルの変数の異常はありません。また、X を X のコレクションと混同しません。長い目で見れば、クラスが何かであり、また何かのコレクションでもある場合、混乱を招くと思います。

シンプルは複雑よりも優れています。

于 2008-09-17T10:18:30.027 に答える