Python - 函数内部的静态变量

时间:2013-10-25 09:16:34

标签: python static-variables

我正在尝试在函数内设置静态变量。基本上,我希望这个变量最初是false。在第一次调用此函数后,我希望将变量设置为true

我目前有以下内容:

class LKTracker(object):

    def track_points(self,width,height):
        if not hasattr(track_points, "gotInitialFeatures"):
            track_points.gotInitialFeatures = None

        if not track_points.gotInitialFeatures:
            #do some stuff
        track_points.gotInitialFeatures = True

使用此代码,我一直收到以下错误:

NameError: global name 'track_points' is not defined

有人知道这里发生了什么吗?

2 个答案:

答案 0 :(得分:5)

在全局函数中,您可以通过查找名称直接引用函数对象。

在方法中起作用;你必须在课堂上查看方法:

LKTracker.track_points

然而,这仍然无法达到你想要的效果,因为你当时会得到一个未绑定的方法对象:

>>> LKTracker.track_points
<unbound method LKTracker.track_points>

方法对象是按需创建的(因为函数是descriptors),并且在方法对象上创建属性是徒劳的;他们通常只活一会儿。

您需要访问该功能:

>>> LKTracker.track_points.__func__
<function track_points at 0x103e7c500>

但您可以在self上执行相同操作:

self.track_points.__func__

现在您可以添加一个属性:

track_points = self.track_points.__func__
if not hasattr(track_points, "gotInitialFeatures"):
    track_points.gotInitialFeatures = None

if not track_points.gotInitialFeatures:
    #do some stuff
track_points.gotInitialFeatures = True

但是,将更多更容易将该属性存储在该类中:

if not hasattr(LKTracker, 'gotInitialFeatures'):

答案 1 :(得分:1)

在调用函数之前,你应该初始化静态变量。

def static_var(varname, value):
   def decorate(func):
     setattr(func, varname, value)
     return func
   return decorate

现在你可以:

@static_var("gotInitialFeatures", False)
def track_points(self, width, height):
   ...