2024-04-25 20:34:57 发布
网友
这个C/C++代码的惯用的Python等价物是什么?
void foo() { static int counter = 0; counter++; printf("counter is %d\n", counter); }
具体来说,如何在函数级实现静态成员,而不是类级?把函数放到类中会改变什么吗?
人们还可以考虑:
def foo(): try: foo.counter += 1 except AttributeError: foo.counter = 1
推理:
if
有点颠倒,但这应该有效:
def foo(): foo.counter += 1 print "Counter is %d" % foo.counter foo.counter = 0
如果希望计数器初始化代码位于顶部而不是底部,可以创建一个decorator:
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.前缀。
foo.
(贷方:@ony)
可以向函数添加属性,并将其用作静态变量。
def myfunc(): myfunc.counter += 1 print myfunc.counter # attribute must be initialized myfunc.counter = 0
或者,如果不想在函数外部设置变量,可以使用hasattr()来避免AttributeError异常:
hasattr()
AttributeError
def myfunc(): if not hasattr(myfunc, "counter"): myfunc.counter = 0 # it doesn't exist yet, so initialize it myfunc.counter += 1
无论如何,静态变量是相当罕见的,您应该为这个变量找到一个更好的位置,很可能是在类中。
人们还可以考虑:
推理:
if
分支(想想StopIteration异常)有点颠倒,但这应该有效:
如果希望计数器初始化代码位于顶部而不是底部,可以创建一个decorator:
然后使用如下代码:
不幸的是,它仍然要求您使用
foo.
前缀。(贷方:@ony)
可以向函数添加属性,并将其用作静态变量。
或者,如果不想在函数外部设置变量,可以使用
hasattr()
来避免AttributeError
异常:无论如何,静态变量是相当罕见的,您应该为这个变量找到一个更好的位置,很可能是在类中。
相关问题 更多 >
编程相关推荐