1

我正在尝试在函数内设置一个静态变量。本质上,我希望这个变量是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

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

4

2 回答 2

6

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

这在方法中不起作用;你必须在类上查找方法:

LKTracker.track_points

但是,这仍然不能满足您的要求,因为此时您会得到一个未绑定的方法对象:

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

方法对象是按需创建的(因为函数是描述符),在方法对象上创建属性是徒劳的;他们通常只活很短的时间。

您需要改为访问该功能:

>>> 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'):
于 2013-10-25T09:24:31.650 回答
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):
   ...
于 2013-10-25T09:22:01.970 回答