Wenn ein Dekorateur mit einer Klasse definiert, wie transferiere ich automatisch über __name__, __module__und __doc__? Normalerweise würde ich den @wraps Dekorator von functools verwenden. Folgendes habe ich stattdessen für eine Klasse getan (dies ist nicht ganz mein Code):
class memoized:
"""Decorator that caches a function's return value each time it is called.
If called later with the same arguments, the cached value is returned, and
not re-evaluated.
"""
def __init__(self, func):
super().__init__()
self.func = func
self.cache = {}
def __call__(self, *args):
try:
return self.cache[args]
except KeyError:
value = self.func(*args)
self.cache[args] = value
return value
except TypeError:
# uncacheable -- for instance, passing a list as an argument.
# Better to not cache than to blow up entirely.
return self.func(*args)
def __repr__(self):
return self.func.__repr__()
def __get__(self, obj, objtype):
return functools.partial(self.__call__, obj)
__doc__ = property(lambda self:self.func.__doc__)
__module__ = property(lambda self:self.func.__module__)
__name__ = property(lambda self:self.func.__name__)
Gibt es einen Standarddekorateur, der die Erstellung von Namensmodulen und Dokumenten automatisiert? Auch um die get-Methode zu automatisieren (ich nehme an, das dient zum Erstellen gebundener Methoden?) Gibt es fehlende Methoden?
__name__und__doc__werden auf die Instanz gesetzt , aber nicht auf die Klasse, die immer von verwendet wirdhelp(instance). Um dies zu beheben, kann keine klassenbasierte Decorator-Implementierung verwendet werden. Stattdessen muss der Decorator als Funktion implementiert werden. Weitere Informationen finden Sie unter stackoverflow.com/a/25973438/1988505 .