0

これが遅延評価と呼ばれるかどうかは100%確信が持てませんが、Pythonでこれを行うことを望んでいます。

ユーザーが通過し、クラスのパラメーターとして使用されるいくつかのグローバル変数を作成する「セットアップウィザード」があります。

var = myClass(param1, param2)グローバル変数 param1 および param2 が存在するまで評価しないでください。var0 = var.funcただし、 myClass 内の関数であるを関連付けているため、var が存在する必要があります。その後、アプリケーションで var0 が呼び出され、func() が実行されます。

更新しました

これが私のコードの一部です:

class myClass:

    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2
    #------------------------------------------------------------------------
    def myFunction(self):
        """
        Some work here using self.param1 and self.param2
        """
    def myFunction2(self):
        """
        Some work here using self.param1 and self.param2
        """
    def myFunction3(self):
        """
        Some work here using self.param1 and self.param2
        """

myInstance = myClass(PARAM1, PARAM2)

myDict = {}
myDict["key1"] = myInstance.myFunction
myDict["key2"] = myInstance.myFunction2
myDict["key3"] = myInstance.myFunction3
# and so on...

PARAM1PARAM2wxPython ウィザード内のアクションを通じて、ユーザーによってグローバル変数として設定されます。問題は、andがまだ存在しないmyInstanceため、初期化時に評価できないことです。ただし、ディクショナリ キーは初期化時にさまざまな関数に関連付けられています。これらの関数は時間の経過とともに変化しないためです。PARAM1PARAM2

アイデア?

4

4 に答える 4

2

いいえ、あなたはこれをしたくありません。

本当にこれを行う必要がある場合は、promiseまたはfutureを使用して、これらの式の評価を遅らせる必要があります。これは、変数が存在する場合でも、メンバーを持つオブジェクトを保持している場合にのみvar、式var.funcが例外なく評価されるためです。Pythonには多くの約束または将来のライブラリがあります-自分に最も適したものを選択するために、自分でグーグルで検索することをお勧めします。varfunc

ただし、これを行うためのより良い方法は、クラスが存在するか、グローバル変数が設定されるまで、これらの操作を実行しないことです。

残念ながら、あなたはあなたがしていることの詳細をほとんど提供していないので、これ以上具体的なアドバイスを提供することは不可能です。

于 2012-07-11T17:38:32.097 に答える
1

これは悪いアイデアです

しかし、ここにあなたが望むことをするいくつかのコードがあります...

class myClass(object):
    @property
    def var0(self):
        return param1

a=myClass()
try:
    print (a.var0) #NameError because param1 isn't defined yet.
except NameError:
    pass

param1="foo"   
print a.var0

これをさらに「賢く」することができます(以下を参照)-これで、ある時点で作成される変数の名前を含む文字列を渡す必要があります。

class myClass(object):
    def __init__(self,varname):
        self.varname=varname
    @property
    def var0(self):
        return globals()[self.varname]

a=myClass('param1')
try:
    print (a.var0) #KeyError now
except KeyError:
    pass

param1="foo"
print a.var0

これは、クラスで実際に使用されるまで、グローバル変数へのアクセスを延期します。param1ただし、一般的に、これは実行したくありません。渡す変数が定義されるまで、インスタンスの作成を延期します。

于 2012-07-11T17:36:47.037 に答える
0

コードでこれを回避するためにデコレータを使用し@staticmethodましたが、現時点でこれが最良の答えであるかどうかわからないため、答えとして受け入れません!!

class myClass:
    #------------------------------------------------------------------------
    @staticmethod
    def myFunction(param1, param2):
        """
        Some work here using param1 and param2
        """
    @staticmethod
    def myFunction2(param1, param2):
        """
        Some work here using param1 and param2
        """
    @staticmethod
    def myFunction3(param1, param2):
        """
        Some work here using param1 and param2
        """

myDict = {}
myDict["key1"] = myClass.myFunction
myDict["key2"] = myClass.myFunction2
myDict["key3"] = myClass.myFunction3
# and so on...

ユーザーがセットアップ ウィザードを通過して と が入力された後、PARAM1辞書PARAM2をループして、関連する関数を使用してそれぞれの値のペアを計算できます。PARAM1PARAM2

for k in myDict.keys():
    myDict[k](PARAM1, PARAM2)
于 2012-07-11T23:37:00.483 に答える
0

それ以外の

var = MyClass(p1, p2)

p1 = get_p1()
p2 = get_p2()

# magic happens

なぜだめですか

var = MyClass()

p1 = get_p1()
var.p1 = p1

p2 = get_p2()
var.p2 = p2
于 2012-07-11T18:56:16.833 に答える