ProgrammierungBackend Entwickler

Was sind Klassen-Dekoratoren in Python? Wie kann man mit ihnen die Funktionalität von Klassen modifizieren oder ergänzen? Geben Sie ein Beispiel und sprechen Sie über mögliche Nuancen.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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.

Einfaches Beispiel eines Klassen-Dekorators:

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}>
  • Der Dekorator add_repr fügt dynamisch die Methode __repr__ zu allen Klassen hinzu, auf die er angewendet wird.

Nuancen:

  • Klassen-Dekoratoren können nicht nur Einbettungen in die Klasse zurückgeben, sondern auch vollständig umwickelte (z. B. Proxy-Klassen oder Erben).
  • Fehler können auftreten, wenn der Dekorator nicht die Argumente *args und **kwargs unterstützt, die beim Erstellen von Klasseninstanzen verwendet werden.

Fangfrage.

Was passiert, wenn man zwei Klassen-Dekoratoren hintereinander anwendet? Ist die Reihenfolge ihrer Anwendung immer offensichtlich?

Antwort:

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))

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


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.