Skip to main content
 首页 » 编程设计

python之python方法中的静态变量

2025年05月04日8jirigala

在 Python 方法中,我希望有一个局部变量,其值在方法调用之间保持不变。

This question展示了如何在函数内部声明这样的“静态变量”(c++ 术语)。我试图在实例方法中做同样的事情,但失败了。

这是一个重现问题的最小工作示例。您可以将其复制粘贴到解释器中。

class SomeClass(object): 
    def some_method(self): 
        if not hasattr(SomeClass.some_method, 'some_static_var'): 
            SomeClass.some_method.some_static_var = 1  # breaks here 
 
        for i in range(3): 
            print SomeClass.some_method.some_static_var 
            SomeClass.some_method.some_static_var += 1 
 
if __name__ == '__main__': 
    some_instance = SomeClass() 
    some_instance.some_method() 

在标有“# breaks here”的行上,我得到:

AttributeError: 'instancemethod' 对象没有属性 'some_static_var'

我意识到有一个简单的解决方法,我将 some_static_var 设为 SomeClass 的成员变量。但是,该变量在方法之外确实没有用处,因此如果可以的话,我更愿意避免它弄乱 SomeClass 的命名空间。

请您参考如下方法:

在 python 2 中,您必须处理绑定(bind)和未绑定(bind)方法。它们没有 __dict__ 属性,就像函数一样:

#python 2 
'__dict__' in dir(SomeClass.some_method) 
Out[9]: False 
 
def stuff(): 
    pass 
 
'__dict__' in dir(stuff) 
Out[11]: True 

在 python 3 中,您的代码工作正常!绑定(bind)/未绑定(bind)方法的概念消失了,一切都是函数。

#python 3 
'__dict__' in dir(SomeClass.some_method) 
Out[2]: True 

回到让你的代码工作,你需要把属性放在有 __dict__ 的东西上:实际的功能:

if not hasattr(SomeClass.some_method.__func__, 'some_static_var'): 
    #etc 

Read more on im_func and __func__ here

由您决定这是否使您的代码更具可读性 - 对我来说,使这些类型的东西成为类属性几乎总是可行的方法;只有一种方法访问所述属性并不重要,这是我寻找“静态”类型变量的地方。我重视可读代码胜过干净的命名空间。

最后一段当然是一篇社论,每个人都有权发表自己的意见:-)