此 C / C ++ 代码的惯用 Python 等效项是什么?
void foo()
{
static int counter = 0;
counter++;
printf("counter is %d\n", counter);
}
具体来说,如何在函数级别(而不是在类级别)实现静态成员?并将函数放入类中是否会发生任何变化?
有点相反,但这应该起作用:
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
foo.counter = 0
如果要将计数器初始化代码放在顶部而不是底部,则可以创建一个装饰器:
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
然后使用如下代码:
@static_vars(counter=0)
def foo():
foo.counter += 1
print "Counter is %d" % foo.counter
仍然需要您使用foo.
前缀,很不幸。
(信用: @ony )
您可以向函数添加属性,并将其用作静态变量。
def myfunc():
myfunc.counter += 1
print myfunc.counter
# attribute must be initialized
myfunc.counter = 0
另外,如果您不想在函数外部设置变量,则可以使用hasattr()
避免AttributeError
异常:
def myfunc():
if not hasattr(myfunc, "counter"):
myfunc.counter = 0 # it doesn't exist yet, so initialize it
myfunc.counter += 1
无论如何,静态变量很少见,您应该为该变量找到一个更好的位置,很可能在类中。
还可以考虑:
def foo():
try:
foo.counter += 1
except AttributeError:
foo.counter = 1
推理:
if
分支(认为StopIteration异常)