Python Decorator函数中的静态变量

SangminKim

我一直在寻找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()     

但是它打印12增加foo.counter

为什么...?

为什么foo.counter0每次调用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()

装饰器包装可能会使其变异或返回新功能或两者的其他功能。

请参阅:通过12个简单步骤了解Python装饰器

如果我们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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章