クラスに関する情報をクラス(静的)変数として保存したいと思います。しかし、これらがどのように初期化されるのか理解できません。これが基本的な、ばかげた例です:
class A(object):
clsVar = 'a'
@classmethod
def clsMeth(cls):
print 'changing clsVar'
cls.clsVar = 'b'
A.clsMeth()
# prints 'changing clsVar'
print A.clsVar # prints 'a'
A.clsVar = 'b'
print A.clsVar # prints 'b'
関数が呼び出されたので(printステートメントが機能したため)、クラス変数が変更されたままにならなかったのはなぜですか?クラス定義の完了後にメタクラスを使用したくない場合は、メタクラスを使用する必要がありますか?
[具体的には、私clsMeth
はデコレータになり、クラス変数をそのように装飾されたすべての関数のリストにしたいです。これはそれを達成するための正しい方法ではないと思うので、先に進みましたが、それでも興味があります。]
編集:多くの人が指摘しているように、上記のコードは実行されません。A.clsMeth()
の呼び出しが以前のバージョンのを参照して実行するIPythonセッションで実行していましたA
。これが通訳言語を使うことのリスクだと思います。私はこのようなもので行くことになりました:
outsideDict = {}
def outsideDec(func):
outsideDict[func.__name__] = func
class A(object):
@outsideDec
def someMethod(self):
print 'ID %s' % id(self)
def otherMethod(self):
print 'other'
print outsideDict
one, two = A(), A()
outsideDict['someMethod'](one)
outsideDict['someMethod'](two)
おそらくこれは別の質問になるはずoutsideDec
ですが、実行されたときに、引数がどのクラスのメンバーであるかを判断する方法はありますか?または、Pythonでこのようなイントロスペクションを行うためのより良い方法はありますか?私はここでコースを逸脱していることを認識しているので、以下の回答を受け入れてさらに調査を行います。みんな、ありがとう!