Als ich nach Pythons "Sammlungen" recherchierte, gab es fast keinen Artikel über "Sammlungen". Daher habe ich versucht, die Verwendung zusammenzufassen.
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.
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.
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.
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