Я пытаюсь решить сложную проблему, которую не знаю, как решить в python изящным способом.
Допустим, у меня есть класс с добавленной функцией:
class A(object):
def __init__(self, fn):
self.fn = fn #assuming fn is from int to int
Допустим, я также создаю оболочку:
class A_twice(object):
def __init__(self, a_instance):
def do_twice(x):
return a_instance.fn(x) + a_instance.fn(x)
self.fn = do_twice
Предположим, я создаю вторую оболочку вокруг A:
class A_with_storage(object):
def __init__(self, a_instance):
def fn_store_output(x, list_):
value = a_instance.fn(x)
list_.append(value)
return value
self.fn_with_storage = fn_store_output
Я могу сделатьследующее:
a = A(lambda x : x*x)
a.fn(3) #9
a_twice = A_twice(a)
a_twice.fn(3) #18
a_stored = A_with_storage(a)
l = []
a_stored.fn_with_storage(3, l)
#l = [9]
a_twice_stored = A_with_storage(a_twice)
l2 = []
a_twice_stored.fn_with_storage(3,l2)
#l2 = [18]
Как мы видим, fn_with_storage
упаковывает вызов в fn
, но не включает "внутренние" вызовы внутреннего fn, выполняемые начальным fn.Есть ли способ сделать это?Мне нужен «волшебный» способ определить A_with_storage так, чтобы:
a_twice_stored = A_with_storage(a_twice)
l2 = []
a_twice_stored.fn_with_storage(3,l2)
#l2 = [9,9,18]
, т. Е. Обертка «хранилище» автоматически применялась ко всем вызовам «fn», выполняемым внутри каждого замыкания.Возможно ли это как-то?если возможно, я могу пометить каждую функцию fn декоратором или что-то в этом роде
Спасибо!