Wie kann man in Python einen Decorator an eine Funktion "nachträglich" anhängen?
Die Art und Weise, wie ich Dekoratoren von Funktionen in Python verstehe (und ich könnte mich irren), ist, dass sie Nebenwirkungen hinzufügen und den Rückgabewert einer Funktion ändern sollen. Jetzt werden Dekoratoren über der Funktionsdefinition der zu dekorierenden Funktion oder durch eine Zuweisung hinzugefügt. Hier ist ein kleines Beispiel:
def print_args_decor(function):
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, **kwargs)*5 # Modified return value
return wrapper
@print_args_decor
def do_stuff(strg, n=10):
"""Repeats strg a few times."""
return strg * n
new_decorated_func = print_args_decor(do_stuff) # Decoration by assignment
print do_stuff('a', 2) # Output: aaaaaaaaaa
Jetzt,wie hängt man einen Dekorateur an eine an anderer Stelle definierte Funktion an, im Idealfall Beibehaltung des ursprünglichen Funktionsnamens und der Dokumentzeichenfolge (mögenfunctools.wraps
tut)? Zum Beispiel importiere ich dassqrt()
Funktion aus Pythons Mathe-Modul, und möchten Sie es dekorieren, wie gehe ich dabei vor?
from functools import wraps
from math import sqrt
def print_args_decor(function):
@wraps(function)
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, **kwargs)*5 # Modified return value
return wrapper
# Decorate the sqrt() function from math module somehow
@print_args_decor #???
sqrt #???
print sqrt(9)
# Output:
# Arguments: ([9],) {}
# 15 # <--- sqrt(9)*5
Wie wäre es, Methoden innerhalb von Klassen nachträglich zu dekorieren? Wie wäre es, den Unterricht selbst zu dekorieren?