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 に答える