def feuer(): print("💥"). Schießt eine Kugel. Funktioniert. Aber du willst MEHR Power! Also wickelst du einen Decorator drum herum:def doppelschuss(func):
def wrapper():
func() # Original
func() # NOCH MAL! 🔥
return wrapper
@doppelschuss
def feuer():
print("💥")
Jetzt schießt feuer() ZWEI Kugeln! 🎯🎯 Du hast die Funktion "dekoriert" – sie hat jetzt eine zusätzliche Schicht. Wie eine Schokoladenkugel mit Goldfolie drum. 🍫✨@login_required – checkt, ob User eingeloggt ist, BEVOR deine View-Function läuft. Ohne Decorators müsstest du das in JEDER Funktion manuell coden. Chaos!@rate_limit(100) – blockiert Spam-Anfragen. @cache – speichert Ergebnisse für schnellere Antworten. @retry(3) – versucht's dreimal, wenn's fehlschlägt.┌──────────────────────────────────────────┐
│ @decorator ← Wrapper drumrum │
│ ┌─────────────────────────────┐ │
│ │ ORIGINAL FUNKTION │ │
│ │ def attack(): │ │
│ │ print("💥") │ │
│ └─────────────────────────────┘ │
└──────────────────────────────────────────┘
# Decorator fügt Schichten hinzu:
┌─ BEFORE CODE ─────────────┐
│ print("🔥 Power-Up!") │
├───────────────────────────┤
│ ORIGINAL: print("💥") │
├───────────────────────────┤
│ print("✨ Extra Hit!") │
└─ AFTER CODE ──────────────┘
# Aufruf: attack() → 3 Outputs!
# 🔥 Power-Up!
# 💥
# ✨ Extra Hit!@power_shot-Decorator, um durch Shields zu brechen. Definiere ihn so:def power_shot(func):
def wrapper():
func()
func() # Doppelschuss!
return wrapper
@power_shot
def schuss():
print("Feuer")functools.wraps – bewahrt Funktions-Metadaten@repeat(3)__call__ magic methodVerfügbare Befehle:
move() - Bewegenturn() - Drehenprint("Feuer") - Schießen@power_shot - Dekorator für Doppelschuss@power_shot Dekorator!
Unterstütze mein neues Projekt "Leyla's Code" mit einer Bitcoin-Spende!
💰
Bitcoin-Adresse:
Jede Spende hilft, Leyla's Code weiterzuentwickeln – danke, Captain! 🏴☠️
Dekoratoren gehören zu den fortgeschrittensten und mächtigsten Features der Python-Programmierung. In Level 23 von Leyla's Code lernst du, wie du mit Dekoratoren Funktionen modifizieren und erweitern kannst, ohne deren ursprünglichen Code zu verändern. Diese Technik der Meta-Programmierung - Code, der Code modifiziert - ist ein Kennzeichen professioneller Python-Entwicklung und wird in Frameworks wie Flask, Django und FastAPI intensiv genutzt.
Ein Dekorator ist eine Funktion, die eine andere Funktion als Parameter nimmt, ihre Funktionalität erweitert und eine modifizierte Version zurückgibt. Das @-Symbol vor einer Funktionsdefinition ist syntaktischer Zucker für diesen Prozess. Wenn du @decorator vor eine Funktion schreibst, ist das äquivalent zu: meine_funktion = decorator(meine_funktion). Dekoratoren ermöglichen es, Cross-Cutting Concerns wie Logging, Timing, Caching oder Authentifizierung elegant zu implementieren.
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} dauerte {time.time()-start:.2f}s")
return result
return wrapper
@timer
def lange_berechnung():
time.sleep(2)
return "Fertig!"
Fortgeschrittene Dekoratoren können selbst Parameter akzeptieren. Dafür benötigst du eine zusätzliche Verschachtelungsebene - einen Dekorator, der einen Dekorator zurückgibt. Diese Technik wird verwendet, um konfigurierbare Dekoratoren zu erstellen: @repeat(times=3) könnte eine Funktion dreimal ausführen. In Level 23 nutzt du solche parametrisierten Dekoratoren, um die Stärke von Power-Shots zu kontrollieren.
Python liefert mehrere eingebaute Dekoratoren für häufige Anwendungsfälle. @property verwandelt Methoden in Attribute, @staticmethod und @classmethod definieren Methoden, die nicht auf Instanzen operieren, und @functools.wraps erhält Metadaten der originalen Funktion. Das Verständnis dieser Built-ins hilft dir, deine eigenen Dekoratoren professionell zu gestalten und häufige Fallstricke wie den Verlust von __name__ und __doc__ zu vermeiden.
In modernen Web-Frameworks sind Dekoratoren allgegenwärtig. Flask nutzt @app.route('/home') für Routing, Django verwendet @login_required für Authentifizierung, und FastAPI setzt auf @app.get('/') für API-Endpoints. Diese Dekoratoren abstrahieren komplexe Infrastruktur-Details und machen Code lesbar und wartbar. Nach Level 23 verstehst du, wie diese Frameworks unter der Haube funktionieren.
Dekoratoren können nicht nur Funktionen, sondern auch Klassen modifizieren. Class-Dekoratoren fügen Methoden hinzu, ändern Attribute oder implementieren Patterns wie Singleton automatisch. Zudem können mehrere Dekoratoren gestapelt werden (Decorator Chaining): Sie werden von unten nach oben angewendet. Dies ermöglicht modulare, wiederverwendbare Code-Transformationen: @auth @cache @log wendet Authentifizierung, Caching und Logging in dieser Reihenfolge an.
Dekoratoren haben minimalen Performance-Overhead, wenn richtig implementiert. Achte darauf, dass deine Wrapper-Funktion *args und **kwargs korrekt durchreicht. Verwende functools.wraps, um Metadaten zu erhalten. Für Produktionscode sollten Dekoratoren gut dokumentiert sein, da sie das Verhalten von Funktionen nicht-offensichtlich verändern. Vermeide Dekoratoren für triviale Operationen - ihr Hauptvorteil liegt in der Wiederverwendbarkeit über viele Funktionen hinweg.
🏴☠️ Dekorator-Meister? Zeige deine Meta-Programming-Skills in der Community!