这段 C/C++ 代码的惯用 Python 对应代码是什么?
void foo() { static int counter = 0; counter++; printf("counter is %d\n", counter); }
具体来说,如何在函数级别而不是类级别实现静态成员?将函数放入类中会有什么变化吗?
在 Python 中,函数级别的静态变量概念与 C/C++ 中类似,但并不存在相同的方式。但是,您可以使用默认可变参数、函数属性或在类内定义函数来实现类似的功能。
在 Python 中实现类静态变量的一种惯用方法是使用函数属性。具体操作如下:
def foo(): if not hasattr(foo, "counter"): foo.counter = 0 # it will be initialized only once foo.counter += 1 print(f"counter is {foo.counter}") # Testing the function foo() # counter is 1 foo() # counter is 2 foo() # counter is 3
在这个例子中,foo.counter它就像一个静态变量,在函数调用之间保留其值。
foo.counter
模拟静态变量的另一种方法是使用默认可变参数。此方法利用了这样一个事实:默认参数值仅在定义函数时求值一次,而不是每次调用函数时都求值。
def foo(counter=[0]): counter[0] += 1 print(f"counter is {counter[0]}") # Testing the function foo() # counter is 1 foo() # counter is 2 foo() # counter is 3
这里counter是一个只有一个元素的列表,并且它的值在函数调用之间保持不变。
counter
将函数放在类中是实现此目的的另一种方法。如果函数是共享状态的相关函数的较大集合的一部分,则此方法会很有用。
class Foo: counter = 0 @classmethod def foo(cls): cls.counter += 1 print(f"counter is {cls.counter}") # Testing the function Foo.foo() # counter is 1 Foo.foo() # counter is 2 Foo.foo() # counter is 3
在这个例子中,counter是一个类变量,它在类的所有实例中以及函数调用之间保留其值。
hasattr