collections.abc — Αφηρημένες Βασικές Κλάσεις για Containers

Added in version 3.3:Παλαιότερα, αυτό το module ήταν μέρος τουcollections module.

Πηγαίος κώδικας:Lib/_collections_abc.py


Αυτό το module παρέχειαφηρημένες βασικές κλάσεις που μπορούν να χρησιμοποιηθούν για να ελεγχθεί εάν μια κλάση παρέχει μια συγκεκριμένη διεπαφή· για παράδειγμα, εάν είναιhashable ή εάν είναιmapping.

Ένας έλεγχοςissubclass() ήisinstance() για μια διεπαφή λειτουργεί με έναν από τρεις τρόπους.

  1. Μια νέα γραμμένη κλάση μπορεί να κληρονομήσει άμεσα από τις αφηρημένες βασικές κλάσεις. Η κλάση πρέπει να παρέχει τις απαιτούμενες αφηρημένες μεθόδους. Οι υπόλοιπες μέθοδοι mixin προέρχονται από την κληρονομικότητα και μπορούν να παρακαμφθούν αν χρειάζεται. Άλλες μέθοδοι μπορούν να προστεθούν όταν είναι αναγκαίο:

    classC(Sequence):# Direct inheritancedef__init__(self):...# Extra method not required by the ABCdef__getitem__(self,index):...# Required abstract methoddef__len__(self):...# Required abstract methoddefcount(self,value):...# Optionally override a mixin method
    >>>issubclass(C,Sequence)True>>>isinstance(C(),Sequence)True
  2. Υπάρχουσες κλάσεις και ενσωματωμένες κλάσεις μπορούν να καταχωρηθούν ως «εικονικές υποκλάσεις» των ABCs. Αυτές οι κλάσεις θα πρέπει να ορίζουν το πλήρες API, συμπεριλαμβανομένων όλων των αφηρημένων μεθόδων και όλων των μεθόδων mixin. Αυτό επιτρέπει στους χρήστες να βασίζονται στους ελέγχουςissubclass() ήisinstance() για να καθορίσουν εάν υποστηρίζεται η πλήρης διεπαφή. Η εξαίρεση σε αυτό τον κανόνα είναι για τις μεθόδους που προσδιορίζονται αυτόματα από το υπόλοιπο API:

    classD:# No inheritancedef__init__(self):...# Extra method not required by the ABCdef__getitem__(self,index):...# Abstract methoddef__len__(self):...# Abstract methoddefcount(self,value):...# Mixin methoddefindex(self,value):...# Mixin methodSequence.register(D)# Register instead of inherit
    >>>issubclass(D,Sequence)True>>>isinstance(D(),Sequence)True

    Σε αυτό το παράδειγμα, η κλάσηD δεν χρειάζεται να ορίσει τις μεθόδους__contains__,__iter__, και__reversed__ επειδή ο τελεστήςin-operator, η λογικήiteration, και η συνάρτησηreversed() χρησιμοποιούν αυτόματα τις μεθόδους__getitem__ και__len__.

  3. Ορισμένες απλές διεπαφές είναι άμεσα αναγνωρίσιμες από την παρουσία των απαιτούμενων μεθόδων (εκτός αν αυτές οι μέθοδοι έχουν οριστεί σεNone):

    classE:def__iter__(self):...def__next__(self):...
    >>>issubclass(E,Iterable)True>>>isinstance(E(),Iterable)True

    Οι σύνθετες διεπαφές δεν υποστηρίζουν αυτή την τελευταία τεχνική επειδή μια διεπαφή είναι κάτι περισσότερο από την παρουσία ονομάτων μεθόδων. Οι διεπαφές καθορίζουν τη σημασιολογία και τις σχέσεις μεταξύ των μεθόδων που δεν μπορούν να συναχθούν αποκλειστικά από την παρουσία συγκεκριμένων ονομάτων μεθόδων. Για παράδειγμα, η γνώση ότι μια κλάση παρέχει τις μεθόδους__getitem__,__len__ και__iter__ δεν είναι επαρκής για να διακρίνει μια κλάσηSequence από μια κλάσηMapping.

Added in version 3.9:Αυτές οι αφηρημένες κλάσεις υποστηρίζουν πλέον[]. ΔείτεΤύπος Generic Alias καιPEP 585.

Αφηρημένες Βασικές Κλάσεις Συλλογών

Το collections module προσφέρει τις εξήςABCs:

ABC

Κληρονομεί από

Αφηρημένες Μέθοδοι

Mixin Μέθοδοι

Container[1]

__contains__

Hashable[1]

__hash__

Iterable[1][2]

__iter__

Iterator[1]

Iterable

__next__

__iter__

Reversible[1]

Iterable

__reversed__

Generator[1]

Iterator

send,throw

close,__iter__,__next__

Sized[1]

__len__

Callable[1]

__call__

Collection[1]

Sized,Iterable,Container

__contains__,__iter__,__len__

Sequence

Reversible,Collection

__getitem__,__len__

__contains__,__iter__,__reversed__,index, andcount

MutableSequence

Sequence

__getitem__,__setitem__,__delitem__,__len__,insert

ΚληρονομημένεςSequence μέθοδοι καιappend,clear,reverse,extend,pop,remove, and__iadd__

ByteString

Sequence

__getitem__,__len__

ΚληρονομημένεςSequence μέθοδοι

Set

Collection

__contains__,__iter__,__len__

__le__,__lt__,__eq__,__ne__,__gt__,__ge__,__and__,__or__,__sub__,__rsub__,__xor__,__rxor__ καιisdisjoint

MutableSet

Set

__contains__,__iter__,__len__,add,discard

ΚληρονομημένεςSet μέθοδοι καιclear,pop,remove,__ior__,__iand__,__ixor__, και__isub__

Mapping

Collection

__getitem__,__iter__,__len__

__contains__,keys,items,values,get,__eq__, και__ne__

MutableMapping

Mapping

__getitem__,__setitem__,__delitem__,__iter__,__len__

ΚληρονομημένεςMapping μέθοδοι καιpop,popitem,clear,update, καιsetdefault

MappingView

Sized

__init__,__len__ and__repr__

ItemsView

MappingView,Set

__contains__,__iter__

KeysView

MappingView,Set

__contains__,__iter__

ValuesView

MappingView,Collection

__contains__,__iter__

Awaitable[1]

__await__

Coroutine[1]

Awaitable

send,throw

close

AsyncIterable[1]

__aiter__

AsyncIterator[1]

AsyncIterable

__anext__

__aiter__

AsyncGenerator[1]

AsyncIterator

asend,athrow

aclose,__aiter__,__anext__

Buffer[1]

__buffer__

Υποσημειώσεις

[1](1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

Αυτές οι ABCs παρακάμπτουν την μέθοδο__subclasshook__() για να υποστηρίξουν τον έλεγχο μιας διεπαφής μέσω της επαλήθευσης της παρουσίας των απαιτούμενων μεθόδων και του ότι δεν έχουν ρυθμιστεί σεNone. Αυτό λειτουργεί μόνο για απλές διεπαφές. Πιο σύνθετες διεπαφές απαιτούν εγγραφή ή άμεση υποκλάση.

[2]

Ο έλεγχοςisinstance(obj,Iterable) εντοπίζει κλάσεις που είναι καταχωρημένες ωςIterable ή που έχουν την μέθοδο__iter__(), αλλά δεν εντοπίζει τις κλάσεις που πραγματοποιούν επανάληψη με τη μέθοδο__getitem__(). Ο μόνος αξιόπιστος τρόπος για να προσδιοριστεί αν ένα αντικείμενο είναιiterable είναι να καλέσετεiter(obj).

Αφηρημένες Βασικές Κλάσεις Συλλογών – Αναλυτικές Περιγραφές

classcollections.abc.Container

ABC για κλάσεις που παρέχουν την μέθοδο__contains__().

classcollections.abc.Hashable

ABC για κλάσεις που παρέχουν την μέθοδο__hash__().

classcollections.abc.Sized

ABC για κλάσεις που παρέχουν την μέθοδο__len__().

classcollections.abc.Callable

ABC για κλάσεις που παρέχουν την μέθοδο__call__().

Ανατρέξτε στοAnnotating callable objects για λεπτομέρειες σχετικά με τον τρόπο χρήσης τουCallable σε τύπους annotations.

classcollections.abc.Iterable

ABC για κλάσεις που παρέχουν την μέθοδο__iter__().

Ο έλεγχοςisinstance(obj,Iterable) εντοπίζει κλάσεις που είναι καταχωρημένες ωςIterable ή που διαθέτουν τη μέθοδο__iter__(), αλλά δεν εντοπίζει κλάσεις που πραγματοποιούν επανάληψη με τη μέθοδο__getitem__(). Ο μόνος αξιόπιστος τρόπος για να προσδιοριστεί αν ένα αντικείμενο είναιiterable είναι να κληθείiter(obj).

classcollections.abc.Collection

ABC για τις κλάσεις επαναλαμβανόμενων container με μέγεθος.

Added in version 3.6.

classcollections.abc.Iterator

ABC για κλάσεις που παρέχουν τις μεθόδους__iter__() και__next__(). Δείτε επίσης τον ορισμό τουiterator.

classcollections.abc.Reversible

ABC για τις επαναλαμβανόμενες κλάσεις που παρέχουν επίσης τη μέθοδο__reversed__().

Added in version 3.6.

classcollections.abc.Generator

ABC για τις κλάσειςgenerator που υλοποιούν το πρωτόκολλο που ορίζεται στοPEP 342 το οποίο επεκτείνει τουςiterators με τις μεθόδουςsend(),throw() καιclose().

Δείτε.Annotating generators and coroutines για λεπτομέρειες σχετικά με τη χρήση τουGenerator σε τύπους annotations.

Added in version 3.5.

classcollections.abc.Sequence
classcollections.abc.MutableSequence
classcollections.abc.ByteString

ABCs μόνο για ανάγνωση (read-only) και mutablesequences.

Σημείωση υλοποίησης: Μερικές από τις μεθόδους mixin, όπως__iter__(),__reversed__() καιindex(), κάνουν επανειλημμένες κλήσεις στην μέθοδο__getitem__(). Ως αποτέλεσμα, αν η__getitem__() είναι υλοποιημένη με σταθερή ταχύτητα πρόσβασης, οι μέθοδοι mixin θα έχουν γραμμική απόδοση. Ωστόσο, αν η υποκείμενη μέθοδος είναι γραμμική (όπως θα ήταν με μια συνδεδεμένη λίστα), οι mixins θα έχουν τετραγωνική απόδοση και πιθανώς θα χρειαστεί να αντικατασταθούν.

Άλλαξε στην έκδοση 3.5:Η μέθοδος index() πρόσθεσε υποστήριξη για τα ορίσματαstop καιstart.

Deprecated since version 3.12, will be removed in version 3.14:Η ABCByteString έχει αποσυρθεί. Για χρήση στην δακτυλογράφηση, προτιμάται ένωση, όπωςbytes|bytearray, ήcollections.abc.Buffer. Για χρήση ως ABC, προτιμάταιSequence ήcollections.abc.Buffer.

classcollections.abc.Set
classcollections.abc.MutableSet

ABCs μόνο για ανάγνωση (read-only) και mutablesets.

classcollections.abc.Mapping
classcollections.abc.MutableMapping

ABCs μόνο για ανάγνωση (read-only) και mutablemappings.

classcollections.abc.MappingView
classcollections.abc.ItemsView
classcollections.abc.KeysView
classcollections.abc.ValuesView

ABCs για αντιστοιχήσεις, στοιχεία, κλειδιά και τιμέςviews.

classcollections.abc.Awaitable

ABC για αντικείμεναawaitable, που μπορούν να χρησιμοποιηθούν σε εκφράσειςawait. Οι προσαρμοσμένες υλοποιήσεις πρέπει να παρέχουν τη μέθοδο__await__().

Τα αντικείμεναCoroutine και τα στιγμιότυπα της κλάσηςCoroutine είναι όλα παραδείγματα αυτής της ABC.

Σημείωση

Στην CPython, οι generator-based coroutines (generators που είναι decorated με@types.coroutine) είναιawaitables, αν και δεν διαθέτουν μέθοδο__await__(). Η χρήση τηςisinstance(gencoro,Awaitable) γι” αυτές θα επιστρέψειFalse. Χρησιμοποιείτε τη συνάρτησηinspect.isawaitable() για να τις εντοπίσετε.

Added in version 3.5.

classcollections.abc.Coroutine

ABC για κλάσεις συμβατές με τοcoroutine. Αυτές υλοποιούν τις εξής μεθόδους, οι οποίες ορίζονται στοCoroutine Objects:send(),throw(), καιclose(). Οι προσαρμοσμένες υλοποιήσεις πρέπει επίσης να υλοποιούν τη μέθοδο__await__(). Όλα ταCoroutine στιγμιότυπα είναι επίσης στιγμιότυπα της κλάσηςAwaitable.

Σημείωση

Στην CPython, οι generator-based coroutines (generators που είναι διακοσμημένες με@types.coroutine) είναιawaitables, αν και δεν έχουν τη μέθοδο__await__(). Η χρήση τηςisinstance(gencoro,Coroutine) γι” αυτές θα επιστρέψειFalse. Χρησιμοποιείται η συνάρτησηinspect.isawaitable() για να εντοπιστούν.

Βλ.Annotating generators and coroutines για λεπτομέρειες σχετικά με τη χρήση τηςCoroutine σε σχολιασμούς τύπου. Η διακύμανση και η σειρά των παραμέτρων τύπου αντιστοιχούν σε εκείνες τηςGenerator.

Added in version 3.5.

classcollections.abc.AsyncIterable

ABC για κλάσεις που παρέχουν μια μέθοδο__aiter__. Δείτε επίσης τον ορισμό τουasynchronous iterable.

Added in version 3.5.

classcollections.abc.AsyncIterator

ABC για κλάσεις που παρέχουν τις μεθόδους__aiter__ και__anext__. Δείτε επίσης τον ορισμό τουasynchronous iterator.

Added in version 3.5.

classcollections.abc.AsyncGenerator

ABC για κλάσειςasynchronous generator που υλοποιούν το πρωτόκολλο που ορίζεται στοPEP 525 καιPEP 492.

ΔείτεAnnotating generators and coroutines για λεπτομέρειες σχετικά με τη χρήση τουAsyncGenerator σε σχολιασμούς τύπου.

Added in version 3.6.

classcollections.abc.Buffer

ABC για κλάσεις που παρέχουν τη μέθοδο__buffer__(), υλοποιώντας τοbuffer protocol. Δείτε τοPEP 688.

Added in version 3.12.

Παραδείγματα και Συνταγές

Οι ABCs επιτρέπουν να ρωτήσουμε τις κλάσεις ή τα αντικείμενα αν παρέχουν συγκεκριμένη λειτουργικότητα, για παράδειγμα:

size=Noneifisinstance(myvar,collections.abc.Sized):size=len(myvar)

Μερικές από τις ABCs είναι επίσης χρήσιμες ως mixins που διευκολύνουν την ανάπτυξη κλάσεων που υποστηρίζουν τα APIs των container. Για παράδειγμα, για να γράψετε μια κλάση που υποστηρίζει το πλήρες API τουSet, αρκεί να παρέχετε τις τρεις υποκείμενες αφηρημένες μεθόδους:__contains__(),__iter__(), και__len__(). Η ABC παρέχει τις υπόλοιπες μεθόδους, όπως__and__() καιisdisjoint():

classListBasedSet(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=[]forvalueiniterable:ifvaluenotinlst:lst.append(value)def__iter__(self):returniter(self.elements)def__contains__(self,value):returnvalueinself.elementsdef__len__(self):returnlen(self.elements)s1=ListBasedSet('abcdef')s2=ListBasedSet('defghi')overlap=s1&s2# The __and__() method is supported automatically

Σημειώσεις για τη χρήση τωνSet καιMutableSet ως mixin:

  1. Δεδομένου ότι ορισμένες λειτουργίες συνόλων δημιουργούν νέα σύνολα, οι προεπιλεγμένες μέθοδοι mixin χρειάζονται έναν τρόπο δημιουργίας νέων αντικειμένων από έναiterable. Υποτίθεται ότι ο κατασκευαστής της κλάσης έχει μια υπογραφή της μορφήςClassName(iterable). Αυτή η υπόθεση είναι αποσυνδεδεμένη σε μια εσωτερικήclassmethod που ονομάζεται_from_iterable(), η οποία καλεί τοcls(iterable) για να δημιουργήσει ένα νέο σύνολο. Εάν το mixinSet χρησιμοποιείται σε μια κλάση με διαφορετική υπογραφή κατασκευαστή, θα χρειαστεί να αντικαταστήσετε την_from_iterable() με μια μέθοδο κλάσης ή κανονική μέθοδο που μπορεί να δημιουργήσει νέα αντικείμενα από ένα όρισμα iterable.

  2. Για να παρακάμψετε τις συγκρίσεις (πιθανότατα για λόγους απόδοσης, καθώς η σημασιολογία είναι καθορισμένη), ορίστε ξανά τις μεθόδους__le__(), και__ge__(), και οι άλλες λειτουργίες θα ακολουθήσουν αυτόματα.

  3. Το mixinSet παρέχει τη μέθοδο meth:!_hash για να υπολογίσει μια τιμή κατακερματισμού για το σύνολο. Ωστόσο, η μέθοδος__hash__() δεν είναι ορισμένη, επειδή δεν είναι όλα τα σύνολαhashable ή αμετάβλητα. Για να προσθέσετε hashability σε ένα σύνολο χρησιμοποιώντας mixins, κληρονομήστε τόσο από τις κλάσειςSet() όσο καιHashable(), και στη συνέχεια ορίστε__hash__=Set._hash.

Δείτε επίσης

  • ΣυνταγήOrderedSet για ένα παράδειγμα που βασίζεται στην κλάσηMutableSet.

  • Για περισσότερα σχετικά με τις ABCs, δείτε τοabc module και τοPEP 3119.