====== LU05e - Klassenbasierte Decorators in Python ====== Klassenbasierte Decorators sind eine leistungsfähige Ergänzung zu den herkömmlichen, funktionsbasierten Decorators in Python. Sie bieten mehr Flexibilität und können leichter wiederverwendet und erweitert werden. In dieser Theorieseite werden wir die Grundlagen und Anwendungsbeispiele für klassenbasierte Decorators besprechen. ===== Grundkonzepte ===== Ein klassenbasierter Decorator ist eine Klasse, die eine Methode namens ''%%__call__%%'' implementiert. Diese Methode wird aufgerufen, wenn der Decorator auf eine Funktion angewendet wird. Optional kann die Klasse auch eine ''%%__init__%%''-Methode implementieren, um die zu dekorierende Funktion als Argument zu erhalten. ===== Syntax ===== Die grundlegende Syntax für einen klassenbasierten Decorator in Python ist die folgende: class MyDecorator: def __init__(self, original_function): self.original_function = original_function def __call__(self, *args, **kwargs): print(f"Vor dem Aufruf von {self.original_function.__name__}") result = self.original_function(*args, **kwargs) print(f"Nach dem Aufruf von {self.original_function.__name__}") return result @MyDecorator def display(): print("Die Display-Funktion wurde aufgerufen.") In diesem Beispiel wird der Decorator ''MyDecorator'' auf die Funktion ''display'' angewendet. Der "@"-Operator ist hier syntaktischer Zucker für ''display = MyDecorator(display)''. ===== Anwendungsbeispiele ===== ==== Logging Decorator ==== Ein einfaches Beispiel für einen klassenbasierten Decorator könnte ein Logging-Decorator sein, der Informationen vor und nach dem Aufruf einer Funktion ausgibt. class LoggingDecorator: def __init__(self, original_function): self.original_function = original_function def __call__(self, *args, **kwargs): print(f"Logging vor dem Aufruf von {self.original_function.__name__}") result = self.original_function(*args, **kwargs) print(f"Logging nach dem Aufruf von {self.original_function.__name__}") return result @LoggingDecorator def add(a, b): return a + b In diesem Beispiel gibt der ''LoggingDecorator'' Meldungen aus, bevor und nachdem die ''add''-Funktion aufgerufen wird. ==== Timing Decorator ==== Ein weiteres Beispiel könnte ein Timing-Decorator sein, der die Ausführungszeit einer Funktion misst. import time class TimingDecorator: def __init__(self, original_function): self.original_function = original_function def __call__(self, *args, **kwargs): start_time = time.time() result = self.original_function(*args, **kwargs) end_time = time.time() print(f"{self.original_function.__name__} ran in {end_time - start_time} seconds") return result @TimingDecorator def calculate_factorial(num): factorial = 1 for i in range(1, num + 1): factorial *= i return factorial Hier misst der ''TimingDecorator'' die Ausführungszeit der ''calculate_factorial''-Funktion und gibt sie aus. Diese Theorieseite sollte einen umfassenden Überblick über das Konzept der klassenbasierten Decorators in Python bieten. Mit diesen Decorators können Sie komplexe und wiederverwendbare Funktionalitäten in Ihren Python-Anwendungen implementieren. ---- {{tag>M323-LU05}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi