2013-12-06 3 views
0

Целью является обертывание функции или метода и перенос данных с помощью обертки, которая уникальна для завернутой функции.Python - объем функций обертывания

В качестве примера - допустим, у меня есть объект myThing методом foo. Я хочу обернуть myThing.foo с помощью myWrapper и (в качестве примера), я хочу, чтобы иметь возможность подсчитать количество раз, которое на самом деле называется myThing.foo.

До сих пор единственный метод, который я нашел эффективным, - это просто добавить атрибут объекта, но это немного неуклюже.

class myThing(object): 
    def foo(self): 
     return "Foo called." 

def myWrap(some_func): 
    def _inner(self): 
     #a wild kludge appears! 
     try: 
      self.count += 1 
     except AttributeError: 
      self.count = 0 
     return some_func(self) 
    return _inner 

Stick = myThing() 
myThing.foo = myWrap(myThing.foo) 
for i in range(0, 10): 
    Stick.foo() ##outputs "Foo called." 10 times 

Stick.count # the value of Stick.count 

Таким образом, это достигает цели, и в самом деле, если есть несколько экземпляров myThing, то каждый из них «отслеживает» свое собственное значение self.count, которая является частью моей намеченной цели. Однако я не уверен, что добавление атрибута для каждого экземпляра myThing - лучший способ достичь этого. Если, например, я должен был написать оболочку для функции, которая не была частью объекта или класса, добавив атрибуты к объекту, который там не будет, ничего не сделает.

Возможно, есть явка в моем понимании того, что на самом деле происходит, когда метод или функция завернуты. Я знаю, что один может поддерживать какие-то статические данные в закрытии, так как в следующем примере:

def limit(max_value): 
    def compare(x): 
     return x > max_value 
    return compare 

isOverLimit = limit(30) 
isOverLimit(45) #returns True 
isOverLimit(12) #returns False 

alsoOver = limit(20) 
alsoOver(25) # returns True 
isOverLimit(25) # returns False 

Второй пример, доказывающий, что это не просто модифицируя исходный экземпляр limit, и что isOverLimit продолжает действовать как это было до создания второго alsoOver. Поэтому я понимаю, что для обертки есть способ переноса инкрементной переменной с ней, и что я просто пропускаю что-то очевидное.

ответ

1

Похоже, это контратип Counting python method calls within another method

Короткий ответ заключается в использовании декоратора на методе/функции вы хотите посчитать, и у декоратора магазина счетчика в качестве атрибута функции. См. Ответы в вопросе, который я связал.

+0

Я думаю, что вы правы! Я собираюсь поиграть с этим. –

Смежные вопросы