[英]static variables inside a python method
在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()
在标有“#break here here”的行上,我得到:
AttributeError: 'instancemethod' object has no attribute 'some_static_var'
我意识到有一个简单的解决方法,可以将some_static_var
SomeClass
的成员变量。 但是,该变量实际上在方法之外没有任何用处,因此,如果可以的话,我更希望避免使该变量混乱SomeClass
'命名空间。
在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
由您来决定这是否使您的代码更具可读性-对我来说,使这些类型的事情具有类属性几乎总是要走的路。 不管是哪种方法都可以访问所述属性,这是我寻找“静态”类型vars的地方。 我重视可读代码,而不是干净的命名空间。
最后一段当然是社论,每个人都有自己的见解:-)
您不能在方法对象上设置属性。
相反,创建类属性(即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
尽管,如其他地方所述,最好使用类变量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.