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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage