collections.abc — Abstrakte Basisklassen für Container¶
Hinzugefügt in Version 3.3: Früher war dieses Modul Teil des Moduls collections.
Quellcode: Lib/_collections_abc.py
Dieses Modul stellt abstrakte Basisklassen bereit, die verwendet werden können, um zu testen, ob eine Klasse eine bestimmte Schnittstelle bietet; zum Beispiel, ob sie hashbar ist oder ob sie eine Zuordnung ist.
Ein Test mit issubclass() oder isinstance() für eine Schnittstelle funktioniert auf eine von drei Arten.
Eine neu geschriebene Klasse kann direkt von einer der abstrakten Basisklassen erben. Die Klasse muss die erforderlichen abstrakten Methoden bereitstellen. Die verbleibenden Mixin-Methoden stammen aus der Vererbung und können bei Bedarf überschrieben werden. Andere Methoden können nach Bedarf hinzugefügt werden.
class C(Sequence): # Direct inheritance def __init__(self): ... # Extra method not required by the ABC def __getitem__(self, index): ... # Required abstract method def __len__(self): ... # Required abstract method def count(self, value): ... # Optionally override a mixin method
>>> issubclass(C, Sequence) True >>> isinstance(C(), Sequence) True
Bestehende Klassen und eingebaute Klassen können als „virtuelle Unterklassen“ der ABCs registriert werden. Diese Klassen sollten die vollständige API definieren, einschließlich aller abstrakten Methoden und aller Mixin-Methoden. Dies ermöglicht es Benutzern,
issubclass()- oderisinstance()-Tests zu verwenden, um zu bestimmen, ob die vollständige Schnittstelle unterstützt wird. Die Ausnahme von dieser Regel sind Methoden, die automatisch aus dem Rest der API abgeleitet werden.class D: # No inheritance def __init__(self): ... # Extra method not required by the ABC def __getitem__(self, index): ... # Abstract method def __len__(self): ... # Abstract method def count(self, value): ... # Mixin method def index(self, value): ... # Mixin method Sequence.register(D) # Register instead of inherit
>>> issubclass(D, Sequence) True >>> isinstance(D(), Sequence) True
In diesem Beispiel muss die Klasse
Dnicht__contains__,__iter__und__reversed__definieren, da der in-Operator, die Iteration-Logik und die Funktionreversed()automatisch auf die Verwendung von__getitem__und__len__zurückfallen.Einige einfache Schnittstellen sind direkt durch das Vorhandensein der erforderlichen Methoden erkennbar (es sei denn, diese Methoden wurden auf
Nonegesetzt)class E: def __iter__(self): ... def __next__(self): ...
>>> issubclass(E, Iterable) True >>> isinstance(E(), Iterable) True
Komplexe Schnittstellen unterstützen diese letzte Technik nicht, da eine Schnittstelle mehr ist als nur das Vorhandensein von Methodennamen. Schnittstellen legen Semantik und Beziehungen zwischen Methoden fest, die nicht allein aus dem Vorhandensein spezifischer Methodennamen abgeleitet werden können. Beispielsweise reicht es nicht aus zu wissen, dass eine Klasse
__getitem__,__len__und__iter__bereitstellt, um eineSequencevon einerMappingzu unterscheiden.
Hinzugefügt in Version 3.9: Diese abstrakten Klassen unterstützen nun []. Siehe Generic Alias Type und PEP 585.
Abstrakte Basisklassen für Sammlungen¶
Das Modul `collections` bietet die folgenden ABCs.
ABC |
Erbt von |
Abstrakte Methoden |
Mixin-Methoden |
|---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
Geerbte |
||
|
Geerbte |
||
|
|
||
|
Geerbte |
||
|
|
||
|
Geerbte |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
||
|
Fußnoten
Abstrakte Basisklassen für Sammlungen – Detaillierte Beschreibungen¶
- class collections.abc.Container¶
ABC für Klassen, die die Methode
__contains__()bereitstellen.
- class collections.abc.Hashable¶
ABC für Klassen, die die Methode
__hash__()bereitstellen.
- class collections.abc.Callable¶
ABC für Klassen, die die Methode
__call__()bereitstellen.Siehe Beschriftung aufrufbare Objekte für Details zur Verwendung von
Callablein Typannotationen.
- class collections.abc.Iterable¶
ABC für Klassen, die die Methode
__iter__()bereitstellen.Die Überprüfung
isinstance(obj, Iterable)erkennt Klassen, die alsIterableregistriert sind oder eine Methode__iter__()haben, aber sie erkennt keine Klassen, die mit der Methode__getitem__()iterieren. Der einzig zuverlässige Weg festzustellen, ob ein Objekt iterierbar ist, besteht darin,iter(obj)aufzurufen.
- class collections.abc.Collection¶
ABC für bemaßt-iterable Container-Klassen.
Hinzugefügt in Version 3.6.
- class collections.abc.Iterator¶
ABC für Klassen, die die Methoden
__iter__()und__next__()bereitstellen. Siehe auch die Definition von Iterator.
- class collections.abc.Reversible¶
ABC für iterierbare Klassen, die auch die Methode
__reversed__()bereitstellen.Hinzugefügt in Version 3.6.
- class collections.abc.Generator¶
ABC für Generator-Klassen, die das Protokoll implementieren, das in PEP 342 definiert ist und Iteratoren um die Methoden
send(),throw()undclose()erweitert.Siehe Beschriftung von Generatoren und Koroutinen für Details zur Verwendung von
Generatorin Typannotationen.Hinzugefügt in Version 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
- class collections.abc.ByteString¶
ABCs für schreibgeschützte und veränderbare Sequenzen.
Implementierungshinweis: Einige der Mixin-Methoden, wie
__iter__(),__reversed__()undindex(), rufen die zugrunde liegende Methode__getitem__()wiederholt auf. Folglich, wenn__getitem__()mit konstanter Zugriffsgeschwindigkeit implementiert ist, werden die Mixin-Methoden eine lineare Leistung aufweisen; wenn jedoch die zugrunde liegende Methode linear ist (wie bei einer verketteten Liste), werden die Mixins eine quadratische Leistung aufweisen und müssen wahrscheinlich überschrieben werden.- index(value, start=0, stop=None)¶
Gibt den ersten Index von value zurück.
Löst
ValueErroraus, wenn der Wert nicht gefunden wird.Die Unterstützung der Argumente start und stop ist optional, wird aber empfohlen.
Geändert in Version 3.5: Die Methode
index()unterstützt nun die Argumente stop und start.
Veraltet seit Version 3.12, wird in Version 3.17 entfernt: Die ABC
ByteStringwurde als veraltet markiert.Verwenden Sie
isinstance(obj, collections.abc.Buffer), um zur Laufzeit zu testen, obobjdas Buffer-Protokoll implementiert. Für die Verwendung in Typannotationen verwenden Sie entwederBufferoder eine Union, die die von Ihrem Code unterstützten Typen explizit angibt (z.B.bytes | bytearray | memoryview).ByteStringwar ursprünglich als abstrakte Klasse gedacht, die als Obertyp sowohl fürbytesals auch fürbytearraydienen sollte. Da die ABC jedoch nie Methoden hatte, wusste man bei der Prüfung, ob ein Objekt eine Instanz vonByteStringwar, nie wirklich etwas Nützliches über das Objekt. Andere gängige Puffertypen wiememoryviewwurden ebenfalls nie als Untertypen vonByteStringverstanden (weder zur Laufzeit noch von statischen Typ-Checkern).Weitere Details finden Sie in PEP 688.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABCs für schreibgeschützte und veränderliche Sets.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABCs für schreibgeschützte und veränderliche Mappings.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABCs für Mapping-, Items-, Keys- und Values-Views.
- class collections.abc.Awaitable¶
ABC für awaitable Objekte, die in
await-Ausdrücken verwendet werden können. Benutzerdefinierte Implementierungen müssen die__await__()-Methode bereitstellen.Coroutine-Objekte und Instanzen der
CoroutineABC sind alle Instanzen dieser ABC.Hinweis
In CPython sind generatorbasierte Coroutinen (Generatoren, die mit
@types.coroutinedekoriert sind) *awaitables*, auch wenn sie keine__await__()-Methode haben. Die Verwendung vonisinstance(gencoro, Awaitable)für sie gibtFalsezurück. Verwenden Sieinspect.isawaitable(), um sie zu erkennen.Hinzugefügt in Version 3.5.
- class collections.abc.Coroutine¶
ABC für Coroutine-kompatible Klassen. Diese implementieren die folgenden Methoden, die in Coroutine Objects definiert sind:
send(),throw()undclose(). Benutzerdefinierte Implementierungen müssen auch__await__()implementieren. AlleCoroutine-Instanzen sind auch Instanzen vonAwaitable.Hinweis
In CPython sind generatorbasierte Coroutinen (Generatoren, die mit
@types.coroutinedekoriert sind) *awaitables*, auch wenn sie keine__await__()-Methode haben. Die Verwendung vonisinstance(gencoro, Coroutine)für sie gibtFalsezurück. Verwenden Sieinspect.isawaitable(), um sie zu erkennen.Weitere Details zur Verwendung von
Coroutinein Typ-Annotationen finden Sie unter Annotationen für Generatoren und Coroutinen. Die Varianz und Reihenfolge der Typ-Parameter entspricht denen vonGenerator.Hinzugefügt in Version 3.5.
- class collections.abc.AsyncIterable¶
ABC für Klassen, die eine
__aiter__-Methode bereitstellen. Siehe auch die Definition von asynchrones Iterable.Hinzugefügt in Version 3.5.
- class collections.abc.AsyncIterator¶
ABC für Klassen, die
__aiter__und__anext__Methoden bereitstellen. Siehe auch die Definition von asynchroner Iterator.Hinzugefügt in Version 3.5.
- class collections.abc.AsyncGenerator¶
ABC für Klassen von asynchronen Generatoren, die das in PEP 525 und PEP 492 definierte Protokoll implementieren.
Weitere Details zur Verwendung von
AsyncGeneratorin Typ-Annotationen finden Sie unter Annotationen für Generatoren und Coroutinen.Hinzugefügt in Version 3.6.
- class collections.abc.Buffer¶
ABC für Klassen, die die
__buffer__()-Methode bereitstellen und das Pufferprotokoll implementieren. Siehe PEP 688.Hinzugefügt in Version 3.12.
Beispiele und Rezepte¶
ABCs ermöglichen es uns zu fragen, ob Klassen oder Instanzen bestimmte Funktionalitäten bereitstellen, zum Beispiel
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Einige der ABCs sind auch als Mixins nützlich, die es einfacher machen, Klassen zu entwickeln, die Container-APIs unterstützen. Um beispielsweise eine Klasse zu schreiben, die die vollständige Set-API unterstützt, müssen nur die drei zugrunde liegenden abstrakten Methoden bereitgestellt werden: __contains__(), __iter__() und __len__(). Die ABC liefert die verbleibenden Methoden wie __and__() und isdisjoint()
class ListBasedSet(collections.abc.Set):
''' Alternate set implementation favoring space over speed
and not requiring the set elements to be hashable. '''
def __init__(self, iterable):
self.elements = lst = []
for value in iterable:
if value not in lst:
lst.append(value)
def __iter__(self):
return iter(self.elements)
def __contains__(self, value):
return value in self.elements
def __len__(self):
return len(self.elements)
s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2 # The __and__() method is supported automatically
Hinweise zur Verwendung von Set und MutableSet als Mixin
Da einige Set-Operationen neue Sets erzeugen, benötigen die Standard-Mixin-Methoden eine Möglichkeit, neue Instanzen aus einem Iterable zu erstellen. Der Konstruktor der Klasse wird angenommen, eine Signatur in der Form
KlassenName(iterable)zu haben. Diese Annahme wird in eine interneclassmethodnamens_from_iterable()ausgelagert, diecls(iterable)aufruft, um ein neues Set zu erzeugen. Wenn dasSet-Mixin in einer Klasse mit einer anderen Konstruktorsignatur verwendet wird, müssen Sie_from_iterable()durch eine Klassen- oder reguläre Methode überschreiben, die neue Instanzen aus einem Iterable-Argument erstellen kann.Um die Vergleiche zu überschreiben (vermutlich aus Geschwindigkeitsgründen, da die Semantik fest ist), definieren Sie
__le__()und__ge__()neu, dann folgen automatisch die anderen Operationen.Das
Set-Mixin bietet eine_hash()-Methode zur Berechnung eines Hash-Werts für das Set;__hash__()ist jedoch nicht definiert, da nicht alle Sets hashable oder unveränderlich sind. Um die Hashbarkeit von Sets mit Mixins hinzuzufügen, erben Sie sowohl vonSet()als auch vonHashable()und definieren Sie dann__hash__ = Set._hash.
Siehe auch
OrderedSet recipe als Beispiel, das auf
MutableSetaufbaut.Weitere Informationen zu ABCs finden Sie im Modul
abcund in PEP 3119.