在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
'命名空间。
答案 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
虽然如其他地方所述,但最好是类变量