python方法中的静态变量
在Python方法中,我希望有一个局部变量,其值在调用该方法之间保持不变 演示如何在函数内声明此类“静态变量”(c++术语)。我尝试在一个实例方法中执行相同的操作,但失败了 这里有一个简单的例子,重现了这个问题。您可以将其复制粘贴到解释器中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'):
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),他可以将属性放在实际函数上,而不是包装的方法对象上。