Целью является обертывание функции или метода и перенос данных с помощью обертки, которая уникальна для завернутой функции.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
. Поэтому я понимаю, что для обертки есть способ переноса инкрементной переменной с ней, и что я просто пропускаю что-то очевидное.
Я думаю, что вы правы! Я собираюсь поиграть с этим. –