2017-06-18 104 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