collections.abc
— Abstrakta basklasser för behållare¶
Tillagd i version 3.3: Tidigare var denna modul en del av modulen collections
.
Källkod: Lib/_collections_abc.py
Denna modul tillhandahåller abstrakta basklasser som kan användas för att testa om en klass tillhandahåller ett visst gränssnitt, till exempel om den är hashable eller om den är en mapping.
Ett issubclass()
- eller isinstance()
-test för ett gränssnitt fungerar på ett av tre sätt.
En nyskriven klass kan ärva direkt från en av de abstrakta basklasserna. Klassen måste tillhandahålla de abstrakta metoder som krävs. De återstående mixin-metoderna kommer från arv och kan åsidosättas om så önskas. Andra metoder kan läggas till efter behov:
klass C(Sekvens): # Direkt arv def __init__(self): ... # Extra metod som inte krävs av ABC def __getitem__(self, index): ... # Nödvändig abstrakt metod def __len__(self): ... # Krävs abstrakt metod def count(self, värde): ... # Eventuellt åsidosätta en mixin-metod
>>> issubclass(C, Sequence) True >>> isinstance(C(), Sequence) True
Befintliga klasser och inbyggda klasser kan registreras som ”virtuella underklasser” av ABC. Dessa klasser bör definiera hela API:et, inklusive alla abstrakta metoder och alla mixin-metoder. Detta gör att användare kan förlita sig på
issubclass()
ellerisinstance()
-tester för att avgöra om det fullständiga gränssnittet stöds. Undantaget från denna regel är för metoder som automatiskt härleds från resten av API:et:klass D: # Ingen nedärvning def __init__(self): ... # Extra metod som inte krävs av ABC def __getitem__(self, index): ... # Abstrakt metod def __len__(self): ... # Abstrakt metod def count(self, värde): ... # Mixin-metod def index(self, värde): ... # Mixin-metod Sequence.register(D) # Registrera istället för att ärva
>>> issubclass(D, Sequence) True >>> isinstance(D(), Sequence) True
I det här exemplet behöver klassen
D
inte definiera__contains__
,__iter__
och__reversed__
eftersom logiken in-operator, logiken iteration och funktionenreversed()
automatiskt faller tillbaka till att använda__getitem__
och__len__
.Vissa enkla gränssnitt är direkt igenkännliga genom att de nödvändiga metoderna finns (såvida inte dessa metoder har ställts in på
None
):klass E: def __iter__(self): ... def __next__(self): ...
>>> issubclass(E, Iterable) True >>> isinstance(E(), Iterable) True
Komplexa gränssnitt stöder inte denna sista teknik eftersom ett gränssnitt är mer än bara förekomsten av metodnamn. Gränssnitt specificerar semantik och relationer mellan metoder som inte kan härledas enbart från förekomsten av specifika metodnamn. Att veta att en klass tillhandahåller
__getitem__
,__len__
och__iter__
är till exempel inte tillräckligt för att skilja enSequence
från enMapping
.
Tillagd i version 3.9: Dessa abstrakta klasser har nu stöd för []
. Se Generisk aliastyp och PEP 585.
Samlingar Abstrakta basklasser¶
Samlingsmodulen erbjuder följande ABCs:
ABC |
Ärver från |
Abstrakta metoder |
Mixin-metoder |
---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
”skicka”, ”kasta |
|
||
|
|||
|
|||
|
|||
|
|
||
|
Ärvda |
||
|
|
||
|
Ärvda |
||
|
|
||
|
Ärvda |
||
|
|||
|
|||
|
|||
|
|||
|
|||
”skicka”, ”kasta |
|
||
|
|||
|
|
||
|
|
||
|
Fotnoter
Collections Abstrakta basklasser – Detaljerade beskrivningar¶
- class collections.abc.Container¶
ABC för klasser som tillhandahåller metoden
__contains__()
.
- class collections.abc.Hashable¶
ABC för klasser som tillhandahåller metoden
__hash__()
.
- class collections.abc.Callable¶
ABC för klasser som tillhandahåller metoden
__call__()
.Se Annotering av anropsbara objekt för detaljer om hur man använder
Callable
i typannoteringar.
- class collections.abc.Iterable¶
ABC för klasser som tillhandahåller metoden
__iter__()
.Kontrollen
isinstance(obj, Iterable)
upptäcker klasser som är registrerade somIterable
eller som har en__iter__()
-metod, men den upptäcker inte klasser som itererar med__getitem__()
-metoden. Det enda tillförlitliga sättet att avgöra om ett objekt är iterable är att anropaiter(obj)
.
- class collections.abc.Collection¶
ABC för stora iterabla containerklasser.
Tillagd i version 3.6.
- class collections.abc.Iterator¶
ABC för klasser som tillhandahåller metoderna
__iter__()
och__next__()
. Se även definitionen av iterator.
- class collections.abc.Reversible¶
ABC för iterabla klasser som också tillhandahåller metoden
__reversed__()
.Tillagd i version 3.6.
- class collections.abc.Generator¶
ABC för generator-klasser som implementerar protokollet definierat i PEP 342 som utökar iterators med metoderna
send()
,throw()
ochclose()
.Se Annotering av generatorer och coroutines för detaljer om hur man använder
Generator
i typannoteringar.Tillagd i version 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
ABC för skrivskyddade och muterbara sekvenser.
Implementationsanmärkning: Vissa av mixinmetoderna, t.ex.
__iter__()
,__reversed__()
ochindex()
, gör upprepade anrop till den underliggande metoden__getitem__()
. Följaktligen, om__getitem__()
implementeras med konstant åtkomsthastighet, kommer mixinmetoderna att ha linjär prestanda; men om den underliggande metoden är linjär (som den skulle vara med en länkad lista), kommer mixinerna att ha kvadratisk prestanda och kommer sannolikt att behöva åsidosättas.Ändrad i version 3.5: I metoden index() har stöd för argumenten stop och start lagts till.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABC för skrivskyddade och muterbara sets.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABC för skrivskyddade och muterbara mappningar.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABC för mappning, objekt, nycklar och värden views.
- class collections.abc.Awaitable¶
ABC för awaitable-objekt, som kan användas i
await
-uttryck. Anpassade implementationer måste tillhandahålla metoden__await__()
.Coroutine objekt och instanser av
Coroutine
ABC är alla instanser av denna ABC.Anteckning
I CPython är generatorbaserade coroutines (generators dekorerad med
@types.coroutine
) awaitables, även om de inte har en__await__()
-metod. Att användaisinstance(gencoro, Awaitable)
för dem kommer att returneraFalse
. Användinspect.isawaitable()
för att upptäcka dem.Tillagd i version 3.5.
- class collections.abc.Coroutine¶
ABC för coroutine-kompatibla klasser. Dessa implementerar följande metoder, definierade i Coroutine-objekt:
send()
,throw()
, ochclose()
. Anpassade implementationer måste också implementera__await__()
. AllaCoroutine
-instanser är också instanser avAwaitable
.Anteckning
I CPython är generatorbaserade coroutines (generators dekorerad med
@types.coroutine
) awaitables, även om de inte har en__await__()
-metod. Att användaisinstance(gencoro, Coroutine)
för dem kommer att returneraFalse
. Användinspect.isawaitable()
för att upptäcka dem.Se Annotering av generatorer och coroutines för detaljer om hur man använder
Coroutine
i typannoteringar. Variansen och ordningen på typ-parametrarna motsvarar de iGenerator
.Tillagd i version 3.5.
- class collections.abc.AsyncIterable¶
ABC för klasser som tillhandahåller en
__aiter__
-metod. Se även definitionen av asynkron iterabel.Tillagd i version 3.5.
- class collections.abc.AsyncIterator¶
ABC för klasser som tillhandahåller metoderna
__aiter__
och__anext__
. Se även definitionen av asynkron iterator.Tillagd i version 3.5.
- class collections.abc.AsyncGenerator¶
ABC för asynkron generator-klasser som implementerar protokollet definierat i PEP 525 och PEP 492.
Se Annotering av generatorer och coroutines för detaljer om hur man använder
AsyncGenerator
i typannoteringar.Tillagd i version 3.6.
- class collections.abc.Buffer¶
ABC för klasser som tillhandahåller metoden
__buffer__()
och som implementerar buffer protocol. Se PEP 688.Tillagd i version 3.12.
Exempel och recept¶
ABC gör det möjligt för oss att fråga klasser eller instanser om de tillhandahåller viss funktionalitet, till exempel:
size = Ingen
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Flera av ABC:erna är också användbara som mixins som gör det enklare att utveckla klasser som stöder container-API:er. Om du till exempel vill skriva en klass som stöder hela Set
API behöver du bara tillhandahålla de tre underliggande abstrakta metoderna: __contains__()
, __iter__()
och __len__()
. ABC tillhandahåller de återstående metoderna som __and__()
och 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
Anteckningar om hur man använder Set
och MutableSet
som mixin:
Eftersom vissa set-operationer skapar nya set, behöver standardmixinmetoderna ett sätt att skapa nya instanser från en iterable. Klasskonstruktören antas ha en signatur i formen
ClassName(iterable)
. Detta antagande faktureras ut till en internclassmethod
som kallas_from_iterable()
som anroparcls(iterable)
för att producera en ny uppsättning. Om mixinenSet
används i en klass med en annan konstruktörsignatur, måste du åsidosätta_from_iterable()
med en klassmetod eller vanlig metod som kan konstruera nya instanser från ett iterabelt argument.För att åsidosätta jämförelserna (förmodligen för snabbhetens skull, eftersom semantiken är fast), omdefiniera
__le__()
och__ge__()
, så kommer de andra operationerna automatiskt att följa efter.Mixinen
Set
tillhandahåller en metod_hash()
för att beräkna ett hashvärde för uppsättningen, men__hash__()
definieras inte eftersom inte alla uppsättningar är hashable eller oföränderliga. För att lägga till hashbarhet för set med hjälp av mixins, ärva från bådeSet()
ochHashable()
och definiera sedan__hash__ = Set._hash
.
Se även
OrderedSet recept för ett exempel som bygger på
MutableSet
.