Je lisais sur les décorateurs et j'ai essayé de mélanger ces deux exemples et de les rendre décorateurs de classe au lieu des fonctions habituelles. Le premier vous permet seulement d'exécuter une fonction une fois par argument et le second compte combien de fois vous avez exécuté cette fonction. Ils fonctionnent tous les deux bien séparés mais quand j'essaye de décorer une fonction simple avec les deux en même temps ça échoue ... Ou n'échoue pas vraiment mais imprime un mauvais résultat inattendu. J'ai fait quelques lectures et j'ai trouvé que le module functools peut aider mais je ne sais pas comment.Comment utiliser ces décorateurs à deux classes avec functools.update_wrapper?
from functools import update_wrapper
class Memoize:
def __init__(self, func):
self.func = func
self.memo = dict()
update_wrapper(self, func)
def __call__(self, *args):
if args not in self.memo:
self.memo[args] = self.func(args)
else:
print("cls decorator. You have printed this before")
return self.memo[args]
class CallCounter:
def __init__(self, func):
self.func = func
self.calls = 0
self.__name__ = func.__name__
update_wrapper(self, func)
def __call__(self, *args, **kwargs):
self.calls += 1
return self.func(*args, **kwargs)
@Memoize
@CallCounter
def doubleprint(x):
for elem in x:
print(elem + " " + elem)
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Bye')
print(doubleprint.calls)
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Hello')
doubleprint('Bye')
print(doubleprint.calls)