2017-06-18 137 views
1

我想創建一個變量,每次查詢時都會返回一個不同的值。如何創建動態變量?

這是我到目前爲止有:

import datetime 

def getVal(): 
    return datetime.datetime.now().time() 

TMP_VAR = lambda: getVal() 

for a in range(0,10): 
    print TMP_VAR() 

這工作,我得到:

13:06:41.799504 
13:06:41.800129 
13:06:41.800139 
13:06:41.800145 
13:06:41.800161 
13:06:41.800167 
13:06:41.800173 
13:06:41.800179 
13:06:41.800184 
13:06:41.800190 

如何過,TMP_VAR是一個功能了。有沒有辦法讓這個工作以下面的方式?

print TMP_VAR 

實際上,有一個可調用函數鏈接到一個變量。所以每當我把我的TMP_VAR傳遞給另一個函數時,作爲一個參數,它總是重新計算並恰好保持一個新值(不管getVal()函數在那一刻返回)。

+0

看來好像沒有簡單的解決方案來解決這個問題。使用'TMP_VAR()'而不是'TMP_VAR'似乎是比實現基於類的方法更好的解決方案。 – symbolix

回答

1

,如果你不介意先創建一個實例類ATMP,你可以有一個property這種行爲:

from datetime import datetime 

class A: 
    @property 
    def VAR(self): 
     return datetime.now().time() 

TMP = A() 
print(TMP.VAR) 
+1

謝謝。但我現在想避免基於類的解決方案。我知道這可以通過在變量上僞造一個'__call __()'方法來解決,但不知道如何去做。 – symbolix

2

我不認爲這是一個好主意,建議您因爲它更加明顯和可讀,所以將它留給一個函數。

但如果你真的需要這一點 - 沒有使用像

import datetime 


class Timer(object): 
    def __call__(self): 
     return datetime.datetime.now().time() 

    def __str__(self): 
     return str(self()) 


TMP_VAR = Timer() 

類現在我們可以寫

for a in range(0, 10): 
    print TMP_VAR 

for a in range(0, 10): 
    print TMP_VAR() 

並獲得相同輸出的解決方法。

+0

這適用於打印,但如果您確實想將時間用作時間對象,該怎麼辦? –

+0

@tobias_k:如果我們想要調用函數而不調用它 - 我們可以在每次迭代中創建屬性和訪問權限,我想,沒有其他方法 –

2
import datetime 

class dynamic_var(): 

    def __init__(self): 
     pass   

    def getVal(self): 
     return datetime.datetime.now().time() 

    def __repr__(self): 
     return str(self.getVal()) 

    def __str__(self): 
     return str(self.getVal()) 


def main(): 
    tmp_var = dynamic_var() 

    for a in range(0, 50): 
     print(tmp_var) 

if __name__ == "__main__": 
    main() 
+0

我喜歡這個想法!唯一的缺點是你只能以這種方式返回字符串......(不知道OP是否足夠)。 –

+0

有沒有辦法通過'__call__'方法來做到這一點?所以我們不僅限於'__str__'和'__repr__'方法? – symbolix