【问题标题】:How to create a dynamic variable? [duplicate]如何创建动态变量? [复制]
【发布时间】:2017-06-18 12:15:07
【问题描述】:

我想创建一个变量,每次查询时都会返回不同的值。

这是我目前所拥有的:

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() 函数当时返回什么)。

【问题讨论】:

  • 似乎没有简单的解决方案。使用TMP_VAR() 而不是TMP_VAR 似乎比必须实施基于class 的方法更好。

标签: python callable


【解决方案1】:
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()

【讨论】:

  • 我喜欢这个主意!唯一的缺点是您只能以这种方式返回字符串...(不确定这对于 OP 是否足够)。
  • 有没有办法通过__call__ 方法做到这一点?所以我们不限于__str____repr__ 方法?
【解决方案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()

并获得相同的输出。

【讨论】:

  • 这适用于打印,但如果您真的想将时间用作时间对象怎么办?
  • @tobias_k: 如果我们想调用函数而不调用它——我们可以在每次迭代时创建属性和访问,我想,没有其他方法
【解决方案3】:

如果您不介意必须首先创建类 A 的实例 TMP,您可以使用 property 来实现该行为:

from datetime import datetime

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

TMP = A()
print(TMP.VAR)

【讨论】:

  • 谢谢。但我现在想避免使用基于class 的解决方案。我知道这可以通过在变量上伪造 __call__() 方法来解决,但不太确定如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
相关资源
最近更新 更多