🏴‍☠️ LEYLA'S CODE

Level 23 – Die Dekoratoren-Dimensionen

❤️ ❤️ ❤️ ❤️ ❤️
⚗️ Ahoi du Code-Alchemist! Willkommen in den Decorator-Dimensionen! 🏴‍☠️

Stell dir vor, du hast eine Kanonenkugel. Eine ganz normale, simple Kanonenkugel. Aber warte mal... was, wenn du sie in flüssiges Gold tauchen könntest? 🌟 Oder sie mit Feuerrunen verzauberst? 🔥 Oder ihr magische Zielsuch-Fähigkeiten verleihst? Das ist GENAU das, was Decorators machen – sie nehmen eine Funktion und geben ihr Superkräfte, OHNE den ursprünglichen Code anzufassen!

Du hast jetzt über 20 Levels durchgekämpft, Käpt'n Nico! Du kennst Funktionen, Schleifen, Conditionals, sogar List Comprehensions und Lambda-Functions. Aber hier wird's mystisch: Funktionen, die Funktionen modifizieren. Meta-Programmierung, wie die Alten sagen. 🧙‍♂️

🎯 Das Decorator-Prinzip (für Piraten erklärt):

Du hast eine Schiffskannone: 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. 🍫✨

🔧 Warum Decorators in der echten Welt UNVERZICHTBAR sind:

In Flask/Django (Web-Frameworks): @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!

In APIs: @rate_limit(100) – blockiert Spam-Anfragen. @cache – speichert Ergebnisse für schnellere Antworten. @retry(3) – versucht's dreimal, wenn's fehlschlägt.

Decorators sind deine Code-Bodyguards 💂. Sie stehen VOR der Funktion und sagen: "Halt! Erst meine Checks, DANN darfst du rein!" Oder sie stehen DANACH und sagen: "Warte, ich log das noch schnell!" 📝

📊 ASCII-Diagramm – Decorator Wrapper-Flow:
┌──────────────────────────────────────────┐
  @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!

🎮 In diesem Level:
Du kämpfst gegen 3 Feinde mit Schilden 🛡️. Normale Schüsse prallen ab! Du brauchst den @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")

🔑 Decorator-Details (klick Details unten für mehr!):
functools.wraps – bewahrt Funktions-Metadaten
• Decorators mit Parametern – @repeat(3)
• Class-based Decorators – __call__ magic method
• Stacking Decorators – mehrere Layers! 🥞

Bereit, Käpt'n? Lass die Shields zerbrechen! 💥🛡️

Deine Leyla 🐀⚓
"Code ist Magie – Decorators sind die Zaubersprüche!" ✨
🤓 Für Code-Nerds: Noch tiefer eintauchen ⚓
🔧 1. functools.wraps – Der Metadaten-Retter

Problem: Decorators überschreiben den Namen der Original-Funktion. Debugging wird Horror!

# OHNE functools.wraps:
def my_decorator(func):
    def wrapper():
        func()
    return wrapper

@my_decorator
def greet():
    """Sagt Hallo"""
    print("Hi!")

print(greet.__name__)  # "wrapper" ❌
print(greet.__doc__)   # None ❌

# MIT functools.wraps:
from functools import wraps

def my_decorator(func):
    @wraps(func)  # Bewahrt Metadaten!
    def wrapper():
        func()
    return wrapper

@my_decorator
def greet():
    """Sagt Hallo"""
    print("Hi!")

print(greet.__name__)  # "greet" ✅
print(greet.__doc__)   # "Sagt Hallo" ✅

Warum wichtig? Debugger, Logging-Tools und Dokumentation brauchen diese Infos! In Production-Code ist @wraps(func) PFLICHT. 🛡️

🎁 2. Decorators mit Parametern – Die nächste Stufe

Du willst einen Decorator, der 3-mal wiederholt? Oder 5-mal? Flexibel sein! 🔥

def repeat(times):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)  # Parameter!
def shoot():
    print("💥")

shoot()
# Output:
# 💥
# 💥
# 💥

Struktur: Decorator-Factory → Decorator → Wrapper. Drei Schichten! 🧅 Die äußere Funktion nimmt Parameter, die innere ist der eigentliche Decorator.

🌐 3. Real-World Use Cases – Wo du Decorators überall siehst

Flask Web-Framework:
@app.route('/dashboard')
@login_required  # Nur für eingeloggte User!
@admin_only      # Nur für Admins!
def dashboard():
    return render_template('dashboard.html')

Ohne Decorators wäre jede View-Function 20 Zeilen länger mit Boilerplate-Code! 🙈

Performance-Messung:
import time

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f"⏱️ {func.__name__}: {time.time()-start:.3f}s")
        return result
    return wrapper

@timer
def process_data():
    # Heavy computation
    pass

API Rate Limiting:
@rate_limit(requests=100, window=60)  # 100/min
def api_call():
    return fetch_data()

🔥 4. Class-Based Decorators – Für die Profis

Decorators müssen keine Funktionen sein! Du kannst Classes mit __call__ verwenden:

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.count = 0
    
    def __call__(self, *args, **kwargs):
        self.count += 1
        print(f"Call #{self.count}")
        return self.func(*args, **kwargs)

@CountCalls
def greet():
    print("Hello!")

greet()  # Call #1 / Hello!
greet()  # Call #2 / Hello!

Vorteil: Du kannst State speichern (wie self.count)! Mit Funktions-Decorators bräuchtest du nonlocal oder globale Variablen. 🗄️

🥞 5. Stacking Decorators – Mehrere Layers

Du kannst Decorators stapeln wie Pfannkuchen! 🥞

@log_calls       # Äußerste Schicht
@timer           # Mittlere Schicht
@cache           # Innerste Schicht
def complex_calc(x):
    return x ** 2

Reihenfolge: Von unten nach oben! @cache wird ZUERST angewendet, dann @timer, dann @log_calls.

⚠️ 6. Häufige Fehler & Best Practices

❌ FEHLER 1: *args, **kwargs vergessen
# BAD:
def my_decorator(func):
    def wrapper():  # Nimmt keine Args!
        return func()
    return wrapper

@my_decorator
def add(a, b):  # Braucht Args!
    return a + b

add(2, 3)  # TypeError! ❌

✅ FIX: Immer *args, **kwargs!
def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

❌ FEHLER 2: return vergessen
def my_decorator(func):
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)  # Kein return!
    return wrapper

@my_decorator
def get_value():
    return 42

result = get_value()  # result = None ❌

✅ FIX: Immer returnen!
def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)  # ✅
    return wrapper

🎓 Zusammenfassung – Du bist jetzt Decorator-Master!

• Decorators = Funktions-Wrapper mit Superkräften 🦸
@wraps(func) = Pflicht für Production-Code
• Parameter-Decorators = 3-Layer-Struktur (Factory → Decorator → Wrapper)
• Real-World = Flask Routes, API Limiting, Logging, Caching
• Class-based = Für State-Management
• Stacking = Von unten nach oben
• IMMER *args, **kwargs + return!

Du hast Level 23 gemeistert, Käpt'n Nico! Decorators sind eines der mächtigsten Python-Features. In jedem professionellen Codebase wirst du sie sehen. Jetzt bist du bereit! 🏴‍☠️🔥

P.S.: Wenn du Decorators auf deine eigenen Projekte anwendest, wirst du nie wieder zurückwollen. Es ist wie... Code-Magie! ✨

Verfügbare Befehle:

💡 Tipp
Feinde mit Schilden benötigen @power_shot Dekorator!
3 geschützte Feinde müssen besiegt werden!
❤️ ❤️ ❤️ ❤️ ❤️
Zurück zur Übersicht

🏴‍☠️ Unterstütze Leyla's Code – Nutze meine Referral-Links!

Coinbase
Registriere dich &
erhalte 30€ BTC
SimpleSwap
Krypto tauschen
ohne Anmeldung
Cointiply – #1 Crypto Rewards Platform
Trusted by over 5 million users
WhatsApp
Support & Community
Kryptex
Mining Pool & Software
Poser.py
Dein Projekt / Tool

Vielen Dank, dass du meine Links nutzt – du unterstützt damit direkt Leyla's Code! 🏴‍☠️💙

🏴‍☠️ Spende BTC an Leyla's Code 🚀

Unterstütze mein neues Projekt "Leyla's Code" mit einer Bitcoin-Spende!
💰

BTC QR-Code für Leyla's Code

Bitcoin-Adresse:

Jede Spende hilft, Leyla's Code weiterzuentwickeln – danke, Captain! 🏴‍☠️

Python Dekoratoren - Meta-Programmierung meistern

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.

Was sind Dekoratoren?

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.

💡 Praktisches Beispiel - Timing-Dekorator:
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!"

Dekoratoren mit Argumenten

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.

Built-in Dekoratoren in Python

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.

Dekoratoren in Web-Frameworks

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.

Class-Dekoratoren und Decorator-Chaining

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.

Performance und Best Practices

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.

🎯 Lernziel erreicht?
Nach Level 23 verstehst du:
✅ Die Funktionsweise von Dekoratoren
✅ Syntax mit @ und Wrapper-Funktionen
✅ Parametrisierte Dekoratoren
✅ Built-in Dekoratoren (@property, @staticmethod)
✅ Reale Anwendungsfälle in Frameworks

🏴‍☠️ Dekorator-Meister? Zeige deine Meta-Programming-Skills in der Community!