我一直在寻找Python中的静态值。
我发现了这个。
def static_var(varname, value):
def decorate(func):
setattr(func, varname, value)
return func
return decorate
@static_var("counter", 0)
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
它在函数中使用python装饰器作为静态变量。
装饰器在返回装饰的函数之前(static_var)
初始化静态值。(foo.counter)
(foo)
因此,我认为它不应该按预期工作,因为装饰(static_var)
器foo.counter
每次在foo
被调用时都会初始化。
结果,我认为如果两次调用foo(),它应该打印1
两次
foo()
foo()
但是它打印1
并2
增加foo.counter
为什么...?
为什么foo.counter
在0
每次调用foo时都没有初始化?
因为:
def static_var(varname, value):
def decorate(func):
setattr(func, varname, value)
return func
return decorate
@static_var("counter", 0)
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
等效于:
foo = static_var("counter", 0)(foo)
注意static_var()
实际上被调用了吗?现在穿过装饰器;实际上是通过import pdb; pdb.set_trace()
装饰器包装可能会使其变异或返回新功能或两者的其他功能。
如果我们print
在您的装饰器中放一些,请注意会发生什么:
def static_var(varname, value):
print "1"
def decorate(func):
print "2"
setattr(func, varname, value)
return func
print "3"
return decorate
@static_var("counter", 0)
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
foo()
foo()
输出:
$ python foo.py
1
3
2
Counter is 1
Counter is 2
因此,正如我上面所说的;首先
static_var("counter", 0)
被称为 然后,将其返回(返回一个函数)foo
作为第一个参数来调用,该参数设置初始的“计数器”并返回相同的参数(该函数foo
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句