Dekorateure in Python sind eine leistungsstarke und elegante Möglichkeit, das Verhalten von Funktionen oder Klassen zu ändern oder zu verbessern, ohne ihren Quellcode direkt zu ändern. Es handelt sich im Wesentlichen um Funktionen, die eine andere Funktion als Argument betrachten und ihr Verhalten erweitern oder ändern. Mit Dekoratoren können Sie eine andere Funktion einwickeln, um den Code vor und nach der Ausführung der verpackten Funktion auszuführen.
Um einen Dekorateur zu erstellen, können Sie folgende Schritte befolgen:
Hier ist ein Beispiel dafür, wie man einen einfachen Dekorateur erstellt:
<code class="python">def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello()</code>
In diesem Beispiel ist my_decorator
der Dekorateur, und say_hello
ist die Funktion, die dekoriert wird. Wenn say_hello
aufgerufen wird, wird der Code in der wrapper
-Funktion ausgeführt.
Dekorateure bieten mehrere wichtige Vorteile bei der Python -Programmierung:
@decorator
-Syntax ist klar und präzise, wodurch der Code leichter zu lesen und zu verstehen ist.Dekorateure können verwendet werden, um das Verhalten von Funktionen auf verschiedene Weise zu ändern. Hier sind einige allgemeine Anwendungen:
Protokollierung : Dekorateure können Funktionen, Eingänge, Ausgänge und Ausführungszeiten für Debugging- und Überwachungszwecke protokollieren.
<code class="python">def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__}") result = func(*args, **kwargs) print(f"{func.__name__} finished execution") return result return wrapper @log_decorator def add(a, b): return ab</code>
Timing : Sie können Dekoratoren verwenden, um die Ausführungszeit der Funktionen zu messen, was für die Leistungsoptimierung nützlich ist.
<code class="python">import time def timer_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"{func.__name__} took {end_time - start_time} seconds to run.") return result return wrapper @timer_decorator def slow_function(): time.sleep(2) print("Slow function executed")</code>
Authentifizierung und Autorisierung : Dekorateure können verwendet werden, um zu überprüfen, ob ein Benutzer authentifiziert ist, bevor er Zugriff auf bestimmte Funktionen zulässt.
<code class="python">def requires_auth(func): def wrapper(*args, **kwargs): if not authenticated: raise PermissionError("Authentication required") return func(*args, **kwargs) return wrapper @requires_auth def protected_function(): print("This function is protected")</code>
Memoisierung : Dekorateure können die Ergebnisse teurer Funktionsaufrufe zwischenspeichern, um die Leistung zu verbessern.
<code class="python">def memoize(func): cache = {} def wrapper(*args): if args in cache: return cache[args] result = func(*args) cache[args] = result return result return wrapper @memoize def fibonacci(n): if n </code>
Betrachten wir ein praktisches Beispiel für die Implementierung eines Dekorateurs für das Zwischenspeichernergebnisse, das die Leistung rechenintensiver Funktionen erheblich verbessern kann. Wir werden eine Fibonacci -Funktion verwenden, um dies zu demonstrieren:
<code class="python">def memoize(func): cache = {} def wrapper(*args): if args in cache: print(f"Returning cached result for {args}") return cache[args] result = func(*args) cache[args] = result print(f"Caching result for {args}") return result return wrapper @memoize def fibonacci(n): if n </code>
In diesem Beispiel:
memoize
-Dekorateur behält einen Wörterbuch cache
bei, um die Ergebnisse der Funktionsaufrufe zu speichern. Die wrapper
-Funktion prüft, ob das Ergebnis für eine bestimmte Argumente bereits im Cache liegt. Wenn dies der Fall ist, gibt es das zwischengespeicherte Ergebnis zurück; Ansonsten berechnet es das Ergebnis, rehrt es aus und gibt es dann zurück.fibonacci
-Funktion berechnet die Fibonacci -Zahlen rekursiv. Ohne Memoisierung würde dies zu vielen redundanten Berechnungen führen, insbesondere für größere Zahlen. Der auf fibonacci
angewandte @memoize
-Dekorator stellt sicher, dass jede Fibonacci -Zahl nur einmal berechnet und für nachfolgende Anrufe wiederverwendet wird.fibonacci(10)
zum ersten Mal aufgerufen wird, berechnet und rechnet der Dekorateur das Ergebnis. Beim zweiten Anruf nach fibonacci(10)
wird das Ergebnis aus dem Cache abgerufen und die Leistungsverbesserung demonstriert.Dieses Beispiel zeigt, wie Dekorateure verwendet werden können, um die Leistung von Funktionen durch Memoisierung zu verbessern. Dies ist eine gemeinsame Technik bei der Optimierung und dynamischen Programmierszenarien.
Das obige ist der detaillierte Inhalt vonWas sind Dekorateure in Python? Wie erstellen Sie einen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!