collections.abc
— Abstract Base Classes for Containers¶
Νέο στην έκδοση 3.3: Παλαιότερα, αυτό το module ήταν μέρος του collections
module.
Πηγαίος κώδικας: Lib/_collections_abc.py
Αυτό το module παρέχει αφηρημένες βασικές κλάσεις που μπορούν να χρησιμοποιηθούν για να ελεγχθεί εάν μια κλάση παρέχει μια συγκεκριμένη διεπαφή· για παράδειγμα, εάν είναι hashable ή εάν είναι mapping.
Ένας έλεγχος issubclass()
ή isinstance()
για μια διεπαφή λειτουργεί με έναν από τρεις τρόπους.
1) A newly written class can inherit directly from one of the abstract base classes. The class must supply the required abstract methods. The remaining mixin methods come from inheritance and can be overridden if desired. Other methods may be added as needed:
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
2) Existing classes and built-in classes can be registered as «virtual
subclasses» of the ABCs. Those classes should define the full API
including all of the abstract methods and all of the mixin methods.
This lets users rely on issubclass()
or isinstance()
tests
to determine whether the full interface is supported. The exception to
this rule is for methods that are automatically inferred from the rest
of the API:
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
Σε αυτό το παράδειγμα, η κλάση D
δεν χρειάζεται να ορίσει τις μεθόδους __contains__
, __iter__
, και __reversed__
επειδή ο τελεστής in-operator, η λογική iteration, και η συνάρτηση reversed()
χρησιμοποιούν αυτόματα τις μεθόδους __getitem__
και __len__
.
3) Some simple interfaces are directly recognizable by the presence of
the required methods (unless those methods have been set to
None
):
class E:
def __iter__(self): ...
def __next__(self): ...
>>> issubclass(E, Iterable)
True
>>> isinstance(E(), Iterable)
True
Οι σύνθετες διεπαφές δεν υποστηρίζουν αυτή την τελευταία τεχνική επειδή μια διεπαφή είναι κάτι περισσότερο από την παρουσία ονομάτων μεθόδων. Οι διεπαφές καθορίζουν τη σημασιολογία και τις σχέσεις μεταξύ των μεθόδων που δεν μπορούν να συναχθούν αποκλειστικά από την παρουσία συγκεκριμένων ονομάτων μεθόδων. Για παράδειγμα, η γνώση ότι μια κλάση παρέχει τις μεθόδους __getitem__
, __len__
και __iter__
δεν είναι επαρκής για να διακρίνει μια κλάση Sequence
από μια κλάση Mapping
.
Νέο στην έκδοση 3.9: Αυτές οι αφηρημένες κλάσεις υποστηρίζουν πλέον []
. Δείτε Τύπος Generic Alias και PEP 585.
Αφηρημένες Βασικές Κλάσεις Συλλογών¶
Το collections module προσφέρει τις εξής ABCs:
ABC |
Κληρονομεί από |
Αφηρημένες Μέθοδοι |
Mixin Μέθοδοι |
---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
Κληρονομημένες |
||
|
Κληρονομημένες |
||
|
|
||
|
Κληρονομημένες |
||
|
|
||
|
Κληρονομημένες |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
Υποσημειώσεις
Αφηρημένες Βασικές Κλάσεις Συλλογών – Αναλυτικές Περιγραφές¶
- class collections.abc.Container¶
ABC για κλάσεις που παρέχουν την μέθοδο
__contains__()
.
- class collections.abc.Hashable¶
ABC για κλάσεις που παρέχουν την μέθοδο
__hash__()
.
- class collections.abc.Callable¶
ABC για κλάσεις που παρέχουν την μέθοδο
__call__()
.
- class collections.abc.Iterable¶
ABC για κλάσεις που παρέχουν την μέθοδο
__iter__()
.Ο έλεγχος
isinstance(obj, Iterable)
εντοπίζει κλάσεις που είναι καταχωρημένες ωςIterable
ή που διαθέτουν τη μέθοδο__iter__()
, αλλά δεν εντοπίζει κλάσεις που πραγματοποιούν επανάληψη με τη μέθοδο__getitem__()
. Ο μόνος αξιόπιστος τρόπος για να προσδιοριστεί αν ένα αντικείμενο είναι iterable είναι να κληθείiter(obj)
.
- class collections.abc.Collection¶
ABC για τις κλάσεις επαναλαμβανόμενων container με μέγεθος.
Νέο στην έκδοση 3.6.
- class collections.abc.Iterator¶
ABC για κλάσεις που παρέχουν τις μεθόδους
__iter__()
και__next__()
. Δείτε επίσης τον ορισμό του iterator.
- class collections.abc.Reversible¶
ABC για τις επαναλαμβανόμενες κλάσεις που παρέχουν επίσης τη μέθοδο
__reversed__()
.Νέο στην έκδοση 3.6.
- class collections.abc.Generator¶
ABC για τις κλάσεις generator που υλοποιούν το πρωτόκολλο που ορίζεται στο PEP 342 το οποίο επεκτείνει τους iterators με τις μεθόδους
send()
,throw()
καιclose()
.Νέο στην έκδοση 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
- class collections.abc.ByteString¶
ABCs μόνο για ανάγνωση (read-only) και mutable sequences.
Σημείωση υλοποίησης: Μερικές από τις μεθόδους mixin, όπως
__iter__()
,__reversed__()
καιindex()
, κάνουν επανειλημμένες κλήσεις στην μέθοδο__getitem__()
. Ως αποτέλεσμα, αν η__getitem__()
είναι υλοποιημένη με σταθερή ταχύτητα πρόσβασης, οι μέθοδοι mixin θα έχουν γραμμική απόδοση. Ωστόσο, αν η υποκείμενη μέθοδος είναι γραμμική (όπως θα ήταν με μια συνδεδεμένη λίστα), οι mixins θα έχουν τετραγωνική απόδοση και πιθανώς θα χρειαστεί να αντικατασταθούν.Άλλαξε στην έκδοση 3.5: Η μέθοδος index() πρόσθεσε υποστήριξη για τα ορίσματα stop και start.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABCs μόνο για ανάγνωση (read-only) και mutable sets.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABCs μόνο για ανάγνωση (read-only) και mutable mappings.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABCs για αντιστοιχήσεις, στοιχεία, κλειδιά και τιμές views.
- class collections.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()
για να τις εντοπίσετε.Νέο στην έκδοση 3.5.
- class collections.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()
για να εντοπιστούν.Νέο στην έκδοση 3.5.
- class collections.abc.AsyncIterable¶
ABC για κλάσεις που παρέχουν μια μέθοδο
__aiter__
. Δείτε επίσης τον ορισμό του asynchronous iterable.Νέο στην έκδοση 3.5.
- class collections.abc.AsyncIterator¶
ABC για κλάσεις που παρέχουν τις μεθόδους
__aiter__
και__anext__
. Δείτε επίσης τον ορισμό του asynchronous iterator.Νέο στην έκδοση 3.5.
- class collections.abc.AsyncGenerator¶
ABC για κλάσεις asynchronous generator που υλοποιούν το πρωτόκολλο που ορίζεται στο PEP 525 και PEP 492.
Νέο στην έκδοση 3.6.
Παραδείγματα και Συνταγές¶
Οι ABCs επιτρέπουν να ρωτήσουμε τις κλάσεις ή τα αντικείμενα αν παρέχουν συγκεκριμένη λειτουργικότητα, για παράδειγμα:
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)
Μερικές από τις ABCs είναι επίσης χρήσιμες ως mixins που διευκολύνουν την ανάπτυξη κλάσεων που υποστηρίζουν τα APIs των container. Για παράδειγμα, για να γράψετε μια κλάση που υποστηρίζει το πλήρες API του Set
, αρκεί να παρέχετε τις τρεις υποκείμενες αφηρημένες μεθόδους: __contains__()
, __iter__()
, και __len__()
. Η ABC παρέχει τις υπόλοιπες μεθόδους, όπως __and__()
και 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
Σημειώσεις για τη χρήση των Set
και MutableSet
ως mixin:
Δεδομένου ότι ορισμένες λειτουργίες συνόλων δημιουργούν νέα σύνολα, οι προεπιλεγμένες μέθοδοι mixin χρειάζονται έναν τρόπο δημιουργίας νέων αντικειμένων από ένα iterable. Υποτίθεται ότι ο κατασκευαστής της κλάσης έχει μια υπογραφή της μορφής
ClassName(iterable)
. Αυτή η υπόθεση είναι αποσυνδεδεμένη σε μια εσωτερικήclassmethod
που ονομάζεται_from_iterable()
, η οποία καλεί τοcls(iterable)
για να δημιουργήσει ένα νέο σύνολο. Εάν το mixinSet
χρησιμοποιείται σε μια κλάση με διαφορετική υπογραφή κατασκευαστή, θα χρειαστεί να αντικαταστήσετε την_from_iterable()
με μια μέθοδο κλάσης ή κανονική μέθοδο που μπορεί να δημιουργήσει νέα αντικείμενα από ένα όρισμα iterable.Για να παρακάμψετε τις συγκρίσεις (πιθανότατα για λόγους απόδοσης, καθώς η σημασιολογία είναι καθορισμένη), ορίστε ξανά τις μεθόδους
__le__()
, και__ge__()
, και οι άλλες λειτουργίες θα ακολουθήσουν αυτόματα.Το mixin
Set
παρέχει τη μέθοδο meth:!_hash για να υπολογίσει μια τιμή κατακερματισμού για το σύνολο. Ωστόσο, η μέθοδος__hash__()
δεν είναι ορισμένη, επειδή δεν είναι όλα τα σύνολα hashable ή αμετάβλητα. Για να προσθέσετε hashability σε ένα σύνολο χρησιμοποιώντας mixins, κληρονομήστε τόσο από τις κλάσειςSet()
όσο καιHashable()
, και στη συνέχεια ορίστε__hash__ = Set._hash
.
Δείτε επίσης
Συνταγή OrderedSet για ένα παράδειγμα που βασίζεται στην κλάση
MutableSet
.Για περισσότερα σχετικά με τις ABCs, δείτε το
abc
module και το PEP 3119.