Ein Klassen-Dekorator ist eine Funktion, die eine Klasse als Argument annimmt und entweder eine modifizierte oder eine völlig neue Klasse zurückgibt. Mit ihnen kann man dynamisch Methoden hinzufügen, das Verhalten bestehender Methoden ändern oder sogar eine Unterklasse zurückgeben, die die Funktionalität der ursprünglichen Klasse erweitern.
def add_repr(cls): def __repr__(self): return f'<{cls.__name__}: {self.__dict__}>' cls.__repr__ = __repr__ return cls @add_repr class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print(p) # <Point: {'x': 3, 'y': 4}>
add_repr fügt dynamisch die Methode __repr__ zu allen Klassen hinzu, auf die er angewendet wird.*args und **kwargs unterstützt, die beim Erstellen von Klasseninstanzen verwendet werden.Was passiert, wenn man zwei Klassen-Dekoratoren hintereinander anwendet? Ist die Reihenfolge ihrer Anwendung immer offensichtlich?
Dekoratoren werden "von unten nach oben" angewendet: Zuerst wird der Dekorator angewendet, der sich direkt über der Klassendeklaration befindet, dann der nächste höher usw. Die Reihenfolge ist SEHR WICHTIG, da das Ergebnis des ersten Dekorators an den zweiten weitergegeben wird und so weiter.
@dec1 @dec2 class Test: ... # Das ist gleichbedeutend mit: # Test = dec1(dec2(Test))
Geschichte
In einer E-Commerce-Anwendung wollte man die Methoden der Klasse protokollieren, gab jedoch versehentlich nicht das richtige Objekt aus dem Dekorator zurück, wodurch die Methoden ihre Klasseneigenschaften verloren und nicht mehr richtig vererbt wurden, was die Funktionsweise des Modells beeinträchtigte.
Geschichte
In einem Projekt zur Auto-Generierung neuer Methoden wurde ein Dekorator verwendet, aber super() beim Zurückgeben der Unterklasse vergessen. Infolgedessen wurde die Hierarchie und MRO verletzt, was zu nicht funktionierenden Aufrufen der Basisklasse in den Nachkommen führte.
Geschichte
In einem Datenpipeline-Versuch wurden Klassen mit mehreren Dekoratoren umwickelt (Logger, Änderungsverfolger), aber aufgrund der falschen Reihenfolge der Anwendung kam es zu Namenskonflikten der Methoden, was zu Fehlern in der Produktion führte, da "verlorene" Methoden auftraten.