python方法中的静态变量

时间:2014-01-22 17:33:39

标签: python methods static static-variables

在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' object has no attribute 'some_static_var'

我意识到有一个简单的解决方法,我将some_static_var作为SomeClass的成员变量。但是,该变量在该方法之外实际上没有用处,所以如果可能的话,我更倾向于使它免于混乱SomeClass'命名空间。

3 个答案:

答案 0 :(得分:1)

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

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

def stuff():
    pass

'__dict__' in dir(stuff)
Out[11]: True

在python 3中,你的代码运行正常!绑定/未绑定方法的概念已经消失,一切都是函数。

#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

由你来决定这是否会使你的代码具有更多或更少的可读性 - 对我来说,使这些类型的东西几乎总是可以实现的。只有一种方法访问所述属性并不重要,它是我寻找“静态”类型变量的地方。我重视清晰命名空间上的可读代码。

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

答案 1 :(得分:1)

您无法在方法对象上设置属性。

创建属性(即SomeClass.some_var = 1)是标准的Python方式。但是,如果您向我们提供实际问题的高级概述(您为此编写此代码的原因是什么?),我们可能会建议更合适的修复。

答案 2 :(得分:-1)

使用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

虽然如其他地方所述,但最好是类变量