2012-07-11 39 views
0

我不是100%確定這被稱爲懶惰評估或不,但我希望在Python中做到這一點。防止類實例被評估,直到它的參數已被設置

我有一個「設置嚮導」,用戶將經歷並創建一些全局變量,這些全局變量將用作類中的參數。

var = myClass(param1, param2)只有全局變量param1和param2存在時才能被評估。但是,我需要var來存在,因爲我正在關聯var0 = var.func,這是myClass中的一個函數。稍後在應用程序中,將調用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... 

PARAM1PARAM2被填充是以通過wxPython的嚮導內部行爲的用戶全局變量。問題是myInstance無法在初始化時進行評估,因爲PARAM1PARAM2尚不存在。但是,字典鍵在初始化時與各種功能相關聯,因爲它們不會隨時間而改變。

想法?

+5

你可以在這裏提供更多的細節嗎?沒有辦法阻止'myClass(param1,param2)'立即評估param1和param2。具體取決於你需要做什麼,你可能能夠將你的一些對象包裝在一個lambda表達式中,並在稍後對它們進行評估。但是你需要展示一個完整的例子(即使它是假的)。 – BrenBarn 2012-07-11 17:28:14

+0

沒有更多的細節,這並不是真正的問題。 – Marcin 2012-07-11 17:39:43

+1

「我正在關聯var0 = var.func」。除非在這裏有更多的事情發生,否則稍後在應用程序中調用'var.func'會更簡單很多。 – JAB 2012-07-11 17:40:54

回答

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

並且用戶通過設置嚮導和填充PARAM1PARAM2後,我可以通過字典循環和通過使PARAM1PARAM2像這樣使用其相關聯的函數來計算的相應值對:

for k in myDict.keys(): 
    myDict[k](PARAM1, PARAM2) 
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,直到它實際上是在課堂上使用。但是,一般來說,你不想這樣做。推遲實例創建,直到您要傳遞的變量已被定義爲止。

2

不,你不想這樣做。

如果您真的需要這樣做,您應該做的是使用promise或future來延遲對這些表達式的評估。這是因爲即使存在變量var,表達式var.func也只會評估,如果var持有成員func的對象。 python有許多承諾或未來的圖書館 - 我建議你自己谷歌,以便選擇最適合你的圖書館。

但是,更好的方法是直到類存在或設置全局變量時才執行這些操作。

不幸的是,由於您幾乎沒有提供任何細節,因此不可能提供更具體的建議。

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 
相關問題