[Python] Implementieren Sie Ihre eigene listenähnliche Klasse mit collection.UserList

Als ich nach Pythons "Sammlungen" recherchierte, gab es fast keinen Artikel über "Sammlungen". Daher habe ich versucht, die Verwendung zusammenzufassen.

Was ist collection.UserList?

Das offizielle Dokument lautet:

Diese Klasse fungiert als Wrapper für Listenobjekte. Dies ist nützlich als Basisklasse für Ihre eigene listenähnliche Klasse, in der Sie vorhandene Methoden überschreiben oder neue hinzufügen können. Auf diese Weise können Sie der Liste neues Verhalten hinzufügen.

Wie oben erwähnt, ist "UserList" die Basisklasse zum Erstellen einer eigenen listenartigen Klasse. Eine listenähnliche Klasse ist eine Klasse, die "Anhängen" und "Entfernen" erstellen kann und über einen Indexer verfügt.

Versuchen Sie es mit collection.UserList

Als Beispiel implementieren wir eine Liste "ResettableList" mit einer "Reset" -Methode, die die Liste zum Zeitpunkt des Konstruktors in ihren Ausgangszustand zurückversetzt.

python


from collections import UserList


# collections.UserList erben
class ResettableList(UserList):
    def __init__(self, initlist=None):
        super().__init__(initlist)
        self._initlist = initlist.copy()  #Bewahren Sie eine Kopie der Init-Liste auf

    def reset(self):
        self.data = self._initlist.copy()  # self.Daten ist die umschlossene Liste


mylist = ResettableList([1, 2, 3])  #Übergeben Sie die ursprüngliche Liste an den Konstruktor
print(f'mylist = {mylist}')
print(f'mylist.data = {mylist.data}')  # [nicht empfohlen]Sie können mit Daten auf die interne Liste zugreifen

#Sie können wie eine normale Liste arbeiten
print(f'mylist[1] = {mylist[1]}')
mylist.append(4)
print(f'mylist = {mylist}')
mylist.remove(1)
print(f'mylist = {mylist}')

mylist.reset()  #Kehren Sie zum Ausgangszustand zurück
print(f'mylist = {mylist}')

Ergebnis

mylist = [1, 2, 3]
mylist.data = [1, 2, 3]
mylist[1] = 2
mylist = [1, 2, 3, 4]
mylist = [2, 3, 4]
mylist = [1, 2, 3]

ResettableList ist ein Wrapper und speichert die Liste in der Mitgliedsvariablen data. Die "Reset" -Methode, die ihr eigenes Verhalten hat, wird durch Manipulieren dieser "self.data" implementiert. In diesem Beispiel wird auch von außen auf die Mitgliedsvariable "data" zugegriffen. Dieses Verhalten sollte jedoch vermieden werden, da es zu unerwarteten Problemen führen kann.

Um dies zu zeigen, haben wir eine Liste "UnremovableList" implementiert, die keine Elemente entfernen kann.

python


from collections import UserList


#Ausnahme, wenn eine Methode verwendet wird, die ein Element löscht
class RemoveError(Exception):
    pass


class UnremovableList(UserList):
    #Überschreiben Sie die Methode, mit der das Element gelöscht wird, und lösen Sie eine Ausnahme aus
    #Der Einfachheit halber wird hier nur das Entfernen überschrieben
    def remove(self, item):
        raise RemoveError('Cannot remove')


mylist = UnremovableList([1, 2, 3])
print(f'mylist = {mylist}')

#Kann nicht entfernt werden
try:
    mylist.remove(1)
except RemoveError as e:
    print(f'RemoveError: {e}')
print(f'mylist = {mylist}')

# mylist.Ich kann es entfernen, wenn ich auf Daten zugreife
mylist.data.remove(1)
print(f'mylist = {mylist}')

Ergebnis

mylist = [1, 2, 3]
RemoveError: Cannot remove
mylist = [1, 2, 3]
mylist = [2, 3]

Indem Sie auf diese Weise von außen auf "Daten" zugreifen, können Sie die Elemente löschen, die verboten sein sollten.

Es ist in Ordnung, "Liste" zu erben

Wenn Sie eine listenähnliche Klasse erstellen möchten, sollten Sie in der Lage sein, "Liste" zu erben. Gibt es einen Vorteil, collection.UserList anstelle von list zu erben? Im offiziellen Dokument wird es wie folgt geschrieben.

Die Notwendigkeit für diese Klasse wurde teilweise durch die Möglichkeit ersetzt, direkt aus der Liste eine Unterklasse zu erstellen. Es ist jedoch einfacher, diese Klasse zu verwenden, da Sie damit auf die zugrunde liegende Liste als Attribut zugreifen können. Es gibt auch.

"Diese Klasse" ist "UserList". Zusammenfassend: "Sie können" Liste "erben, aber es ist einfacher," Benutzerliste "zu erben."

Mal sehen, wie die Implementierung aussehen würde, wenn wir "list" erben würden. Implementieren Sie auf diese Weise die ResettableList aus dem vorherigen Beispiel.

python


class ResettableList(list):
    def __init__(self, initlist=None):
        super().__init__(initlist)
        self._initlist = initlist.copy()

    def reset(self):
        self.clear()
        self.extend(self._initlist)

Sie müssen mit Ihrer eigenen Instanz arbeiten, anders als wenn Sie "UserList" geerbt haben. Daher habe ich es implementiert, indem ich die Liste einmal geleert und die ursprüngliche Liste hinzugefügt habe.

Ein Vergleich der beiden ist wie folgt. (Es wird nur die "Reset" -Methode beschrieben.)

python


#UserList geerbte Version
class ResettableList(UserList):
    def reset(self):
        self.data = self._initlist.copy()


#Liste der geerbten Version
class ResettableList(list):
    def reset(self):
        self.clear()
        self.extend(self._initlist)

Es ist einfacher, "UserList" zu erben.

abschließend

Bisher habe ich zusammengefasst, wie man collection.UserList auf meine eigene Weise verwendet. UserList hat eine Struktur, die eine Liste enthält, aber von außen betrachtet wie die Liste selbst aussieht. Ich denke, dies wird auch hilfreich sein, wenn gemeinsame Klassen erweitert werden.

Übrigens hat "Sammlungen" auch "UserDict" und "UserString", ähnlich wie "UserList". Es ist eine Basisklasse zum Erstellen von "dict" - bzw. "str" -ähnlichen Klassen. Ich glaube nicht, dass ich diese Klassen sehr oft benutze, aber ich möchte sie in diesen Situationen angemessen verwenden.

Recommended Posts

[Python] Implementieren Sie Ihre eigene listenähnliche Klasse mit collection.UserList
Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Python] Erstelle deinen eigenen LINE-Bot
[Python] Anmelden Ihres eigenen Moduls
Erstellen Sie Ihre eigene Diagrammstrukturklasse und deren Zeichnung mit Python
Rufen Sie mit ctypes Ihre eigene gemeinsam genutzte Bibliothek in C-Sprache von Python aus auf
Erstellen Sie Ihre eigenen Linux-Befehle in Python
Implementieren Sie __eq__ usw. generisch in der Python-Klasse
[LLDB] Erstellen Sie Ihren eigenen Befehl mit Python
Verwenden Sie einfach Ihre eigenen Funktionen in Python
[Python] Packen und verteilen Sie Ihre eigenen Module
Tweet deine eigenen Sätze mit der Markov-Kette
[Python] Registrieren Sie Ihre eigene Bibliothek in PyPI
Bis Sie Ihre eigene Python-Bibliothek installieren
[Python] So fügen Sie RDF Triple mithilfe von rdflib zu Ihrem eigenen Fuseki-Server hinzu
Veröffentlichen Sie Ihre eigene Python-Bibliothek auf Homebrew
Holen Sie sich Ihre eigene IP-Adresse in Python
E-Mail-Anhänge über Ihr Google Mail-Konto mit Python.
Erstellen Sie schnell Ihr eigenes Modul mit setuptools (Python)
Importieren Sie Ihre eigenen Module mit der Python-Entwicklung von Grasshopper
[Python] -Klasse, Instanz
"Kanrika" die Python-Klasse
Über Python, Klasse
Starten Sie Python
Python-Klasse, Instanz
Scraping mit Python
# Python-Grundlagen (Klasse)
Ablauf beim Erstellen eines eigenen Pakets mit setup.py mit Python
Memo zum Erstellen einer eigenen Box mit Peppers Python
Rufen Sie mit Go mit cgo Ihre eigene C-Sprachbibliothek auf
Erstellen Sie Ihre eigenen Big Data in Python zur Validierung
[Einführung in die Udemy Python3 + -Anwendung] 66. Erstellen einer eigenen Ausnahme
Nehmen Sie Ihre eigene maximale Speichernutzung in Linux & Python
Erstellen Sie Ihr eigenes Random Dot Stereogram (RDS) in Python.
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
Rufen wir Ihre eigene C ++ - Bibliothek mit Python auf (Einstellungen)
[Blender x Python] Erstellen Sie Ihre eigene Funktion und Zusammenfassung
Verwenden Sie CASA Toolkit in Ihrer eigenen Python-Umgebung
Erstellen Sie mit pyenv eine Python-Umgebung auf Ihrem Mac
Erstellen Sie Ihre erste GDSII-Datei in Python mit gdspy
Rufen Sie Ihr eigenes Python-Modul aus dem ROS-Paket auf