Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können abstrakte Basisklassen dabei helfen, das Verhalten eines Wörterbuchs perfekt zu überschreiben?

Wie können abstrakte Basisklassen dabei helfen, das Verhalten eines Wörterbuchs perfekt zu überschreiben?

DDD
DDDOriginal
2024-11-23 16:20:30168Durchsuche

How Can Abstract Base Classes Help in Perfectly Overriding a Dictionary's Behavior?

Ein Diktat perfekt überschreiben: Ein Leitfaden mit abstrakten Basisklassen

Beim Erstellen einer Unterklasse des integrierten Dikttyps wird ein einwandfreies Ergebnis erzielt Die Umsetzung kann eine Herausforderung sein. Anstatt die gesamte dict-Klasse zu überschreiben, sollten Sie einen alternativen Ansatz mit Abstract Base Classes (ABCs) aus dem Sammlungen.abc-Modul in Betracht ziehen.

Verwendung von MutableMapping ABC

The MutableMapping ABC bietet eine Schnittstelle für Klassen, die sich wie veränderbare Wörterbücher verhalten. Durch die Implementierung dieser Schnittstelle können Sie ein Objekt erstellen, das sich wie ein Diktat verhält, ohne es direkt in eine Unterklasse zu unterteilen. Hier ist ein Minimalbeispiel:

from collections.abc import MutableMapping

class TransformedDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))  # use the free update to set keys

    def __getitem__(self, key):
        return self.store[self._keytransform(key)]

    def __setitem__(self, key, value):
        self.store[self._keytransform(key)] = value

    def __delitem__(self, key):
        del self.store[self._keytransform(key)]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def _keytransform(self, key):
        return key

Diese Implementierung bietet eine Grundlage für die Manipulation von Schlüsseln durch die _keytransform-Methode. Durch Überschreiben dieser Methode in Unterklassen können Sie benutzerdefinierte Transformationen auf Schlüssel anwenden.

Vorteile der Verwendung von ABCs

Die Implementierung der MutableMapping-Schnittstelle bietet mehrere Vorteile:

  • Vollständigkeit: Das ABC stellt sicher, dass Sie alle erforderlichen Maßnahmen umgesetzt haben Methoden für ein veränderliches Wörterbuch.
  • Automatische Validierung: Das ABC prüft, ob Sie alle erforderlichen Methoden implementiert haben, sodass Sie fehlende Implementierungen frühzeitig erkennen können.
  • Eingebaute Methoden: Sie erhalten automatisch Zugriff auf Methoden wie get, setdefault, pop und andere, ohne diese implementieren zu müssen selbst.

Beispielverwendung

Durch das Erstellen einer Unterklasse von TransformedDict und das Definieren der _keytransform-Methode können Sie die Schlüsselbehandlung anpassen:

class MyTransformedDict(TransformedDict):
    def _keytransform(self, key):
        return key.lower()

s = MyTransformedDict([('Test', 'test')])
assert s.get('TEST') is s['test']
assert 'TeSt' in s

Diese Unterklasse ermöglicht den Schlüsselzugriff ohne Berücksichtigung der Groß- und Kleinschreibung Abruf.

Zusätzliche Hinweise

  • Beizen funktioniert nahtlos mit diesem Ansatz, da Sie intern im Wesentlichen mit einem regulären Diktat arbeiten.
  • Es Im Allgemeinen ist es nicht ratsam, integrierte Typen wie dict direkt in Unterklassen zu unterteilen, da dies zu Verwirrung und unerwarteten Ereignissen führen kann Verhalten.
  • Die Verwendung von ABCs bietet eine saubere und erweiterbare Lösung zum Erstellen von Objekten, die bestimmte Schnittstellen implementieren.

Das obige ist der detaillierte Inhalt vonWie können abstrakte Basisklassen dabei helfen, das Verhalten eines Wörterbuchs perfekt zu überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn