在 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
由您决定这是否使您的代码更具可读性 - 对我来说,使这些类型的东西成为类属性几乎总是可行的方法;只有一种方法访问所述属性并不重要,这是我寻找“静态”类型变量的地方。我重视可读代码胜过干净的命名空间。
最后一段当然是一篇社论,每个人都有权发表自己的意见:-)
