2013-10-25 5 views
1

Я пытаюсь установить статическую переменную внутри функции. По сути, я хочу, чтобы эта переменная первоначально была false. После первого вызова этой функции я хочу, чтобы переменная была установлена ​​на true.Python - Статическая переменная внутри функции

я в настоящее время следующие:

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 

Каждый знает, что здесь происходит?

ответ

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

Спасибо Мартейн. Я думаю, что у меня это получилось :) –

+0

@Giri: Ах, рад, что вы это решили! –

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): 
    ... 
Смежные вопросы