【问题标题】:Python - Static Variable inside FunctionPython - 函数内的静态变量
【发布时间】:2013-11-04 07:59:53
【问题描述】:

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

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

【问题讨论】:

    标签: python static-variables


    【解决方案1】:

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

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

    LKTracker.track_points
    

    然而,这仍然不会做你想做的事,因为此时你会得到一个 unbound 方法对象:

    >>> 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'):
    

    【讨论】:

    • 谢谢马丁。我想我明白了:)
    【解决方案2】:

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

    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):
       ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2016-04-27
      • 2010-11-02
      • 2010-09-16
      • 2016-07-26
      • 2011-06-29
      • 1970-01-01
      相关资源
      最近更新 更多