python方法中的静态变量

python方法中的静态变量,python,methods,static,static-variables,Python,Methods,Static,Static Variables,在Python方法中,我希望有一个局部变量,其值在调用该方法之间保持不变 演示如何在函数内声明此类“静态变量”(c++术语)。我尝试在一个实例方法中执行相同的操作,但失败了 这里有一个简单的例子,重现了这个问题。您可以将其复制粘贴到解释器中 class SomeClass(object): def some_method(self): if not hasattr(SomeClass.some_method, 'some_static_var'):

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

演示如何在函数内声明此类“静态变量”(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()
在标有“此处中断”的行中,我得到:

AttributeError:'instancemethod'对象没有属性'some\u static\u var'


我意识到有一个简单的解决方法,我将
some\u static\u var
作为
SomeClass
的成员变量。但是,该变量在方法之外实际上没有任何用处,因此如果可能的话,我更希望它不会弄乱
SomeClass
”名称空间。

在python 2中,您必须处理绑定和未绑定的方法。这些函数不像函数那样具有
\uuu dict\uuu
属性:

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

def stuff():
    pass

'__dict__' in dir(stuff)
Out[11]: True
在Python3中,您的代码运行良好!绑定/未绑定方法的概念已经消失,一切都是函数

#python 3
'__dict__' in dir(SomeClass.some_method)
Out[2]: True
回到让代码正常工作上来,您需要将属性放在具有
\uuuu dict\uuuu
的对象上:实际函数:

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

这取决于您来决定这是否会使您的代码更具可读性-对我来说,使这些类型的东西具有类属性几乎总是一条路要走;只有一个方法访问上述属性并不重要,我在这里查找“静态”类型变量。我重视可读代码而不是干净的名称空间


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

您不能在方法对象上设置属性


相反,创建类属性(即,
SomeClass.some_var=1
)是标准的Python方法。但是,如果您对您的实际问题(您编写此代码的目的是什么?)有一个高层次的概述,我们可能会建议更合适的修复方法。

使用
global
关键字访问文件级变量

my_static = None

class MyClass(object):
    def some_method(self):
        global my_static
        if my_static is None:
            my_static = 0
        else:
            my_static = my_static + 1
        print my_static

if __name__ == '__main__':
    instance = MyClass()
    instance.some_method()
    instance.some_method()
产出:

0
1

尽管,如其他地方所述,类变量更可取

但是
SomeClass.someu方法.im函数.someu静态变量=1
(假设python2),他可以将属性放在实际函数上,而不是包装的方法对象上。