collections.abc --- Các lớp cơ sở trừu tượng cho vùng chứa¶
Added in version 3.3: Trước đây, mô-đun này là một phần của mô-đun collections.
Source code: Lib/_collections_abc.py
Mô-đun này cung cấp abstract base classes có thể được sử dụng để kiểm tra xem một lớp có cung cấp giao diện cụ thể hay không; ví dụ: đó là hashable hay mapping.
Kiểm tra issubclass() hoặc isinstance() cho một giao diện hoạt động theo một trong ba cách.
Một lớp mới được viết có thể kế thừa trực tiếp từ một trong các lớp cơ sở trừu tượng. Lớp phải cung cấp các phương thức trừu tượng cần thiết. Các phương thức mixin còn lại đến từ sự kế thừa và có thể được ghi đè nếu muốn. Các phương pháp khác có thể được thêm vào khi cần thiết:
lớp C (Trình tự): kế thừa # Direct def __init__(self): ... phương thức # Extra không được ABC yêu cầu def __getitem__(self, index): ... phương thức trừu tượng # Required def __len__(self): ... phương thức trừu tượng # Required def count(self, value): ... # Optionally ghi đè phương thức mixin
>>> issubclass(C, Sequence) đúng >>> isinstance(C(), Trình tự) đúng
Các lớp hiện có và các lớp tích hợp có thể được đăng ký làm "lớp con ảo" của ABC. Các lớp đó phải xác định API đầy đủ bao gồm tất cả các phương thức trừu tượng và tất cả các phương thức mixin. Điều này cho phép người dùng dựa vào các bài kiểm tra
issubclass()hoặcisinstance()để xác định xem giao diện đầy đủ có được hỗ trợ hay không. Ngoại lệ đối với quy tắc này là dành cho các phương thức được suy ra tự động từ phần còn lại của API:lớp D: kế thừa # No def __init__(self): ... phương thức # Extra không được ABC yêu cầu def __getitem__(self, index): ... phương thức # Abstract def __len__(self): ... phương thức # Abstract số def (tự, giá trị): ... phương thức # Mixin chỉ số def (tự, giá trị): ... phương thức # Mixin Sequence.register(D) # Register thay vì kế thừa
>>> issubclass(D, Sequence) đúng >>> isinstance(D(), Trình tự) đúng
Trong ví dụ này, lớp
Dkhông cần xác định__contains__,__iter__và__reversed__vì in-operator, logic iteration và hàmreversed()tự động quay lại sử dụng__getitem__và__len__.Một số giao diện đơn giản có thể được nhận dạng trực tiếp nhờ sự hiện diện của các phương thức được yêu cầu (trừ khi các phương thức đó được đặt thành
None):lớp E: chắc chắn __iter__(tự): ... chắc chắn __next__(tự): ...
>>> issubclass(E, Iterable) đúng >>> isinstance(E(), Iterable) đúng
Các giao diện phức tạp không hỗ trợ kỹ thuật cuối cùng này vì giao diện không chỉ có sự hiện diện của tên phương thức. Các giao diện chỉ định ngữ nghĩa và mối quan hệ giữa các phương thức không thể được suy ra chỉ từ sự hiện diện của tên phương thức cụ thể. Ví dụ: biết rằng một lớp cung cấp
__getitem__,__len__và__iter__là không đủ để phân biệtSequencevớiMapping.
Added in version 3.9: Các lớp trừu tượng này hiện hỗ trợ []. Xem Loại bí danh chung và PEP 585.
Bộ sưu tập Các lớp cơ sở trừu tượng¶
Mô-đun bộ sưu tập cung cấp ABCs sau:
ABC |
Kế thừa từ |
Phương pháp trừu tượng |
Phương pháp Mixin |
|---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
Kế thừa các phương thức |
||
|
Các phương thức |
||
|
|
||
|
Kế thừa các phương thức |
||
|
|
||
|
Kế thừa các phương thức |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
||
|
Chú thích cuối trang
Bộ sưu tập Các lớp cơ sở trừu tượng -- Mô tả chi tiết¶
- class collections.abc.Container¶
ABC cho các lớp cung cấp phương thức
__contains__().
- class collections.abc.Hashable¶
ABC cho các lớp cung cấp phương thức
__hash__().
- class collections.abc.Callable¶
ABC cho các lớp cung cấp phương thức
__call__().Xem Chú thích các đối tượng có thể gọi được để biết chi tiết về cách sử dụng
Callabletrong chú thích kiểu.
- class collections.abc.Iterable¶
ABC cho các lớp cung cấp phương thức
__iter__().Việc kiểm tra
isinstance(obj, Iterable)sẽ phát hiện các lớp được đăng ký làIterablehoặc có phương thức__iter__(), nhưng nó không phát hiện các lớp lặp lại bằng phương thức__getitem__(). Cách đáng tin cậy duy nhất để xác định xem một đối tượng có phải là iterable hay không là gọiiter(obj).
- class collections.abc.Collection¶
ABC dành cho các lớp vùng chứa có thể lặp lại có kích thước.
Added in version 3.6.
- class collections.abc.Iterator¶
ABC cho các lớp cung cấp phương thức
__iter__()và__next__(). Xem thêm định nghĩa của iterator.
- class collections.abc.Reversible¶
ABC cho các lớp lặp cũng cung cấp phương thức
__reversed__().Added in version 3.6.
- class collections.abc.Generator¶
ABC dành cho các lớp generator triển khai giao thức được xác định trong PEP 342 mở rộng iterators bằng các phương thức
send(),throw()vàclose().Xem Trình tạo chú thích và coroutine để biết chi tiết về cách sử dụng
Generatortrong chú thích loại.Added in version 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
- class collections.abc.ByteString¶
ABC dành cho sequences chỉ đọc và có thể thay đổi.
Lưu ý triển khai: Một số phương thức mixin, chẳng hạn như
__iter__(),__reversed__()vàindex()thực hiện các lệnh gọi lặp lại đến phương thức__getitem__()cơ bản. Do đó, nếu__getitem__()được triển khai với tốc độ truy cập không đổi, các phương thức mixin sẽ có hiệu suất tuyến tính; tuy nhiên, nếu phương thức cơ bản là tuyến tính (như với danh sách liên kết), các mixin sẽ có hiệu suất bậc hai và có thể sẽ cần được ghi đè.- index(value, start=0, stop=None)¶
Trả về chỉ mục đầu tiên của value.
Tăng
ValueErrornếu không có giá trị.Việc hỗ trợ các đối số start và stop là tùy chọn nhưng được khuyến nghị.
Thay đổi trong phiên bản 3.5: Phương thức
index()đã nhận được sự hỗ trợ cho các đối số stop và start.
Không được dùng nữa kể từ phiên bản 3.12, sẽ bị xóa trong phiên bản 3.17:
ByteStringABC không còn được dùng nữa.Sử dụng
isinstance(obj, collections.abc.Buffer)để kiểm tra xemobjcó triển khai buffer protocol khi chạy hay không. Để sử dụng trong chú thích loại, hãy sử dụngBufferhoặc liên kết chỉ định rõ ràng các loại mà mã của bạn hỗ trợ (ví dụ:bytes | bytearray | memoryview).ByteStringban đầu được dự định là một lớp trừu tượng sẽ đóng vai trò là siêu kiểu của cảbytesvàbytearray. Tuy nhiên, vì ABC chưa bao giờ có bất kỳ phương thức nào nên việc biết rằng một đối tượng là một thể hiện củaByteStringchưa bao giờ thực sự cho bạn biết bất kỳ điều gì hữu ích về đối tượng đó. Các loại bộ đệm phổ biến khác nhưmemoryviewcũng không bao giờ được hiểu là kiểu con củaByteString(trong thời gian chạy hoặc bằng trình kiểm tra kiểu tĩnh).Xem PEP 688 để biết thêm chi tiết.
- class collections.abc.Set¶
- class collections.abc.MutableSet¶
ABC dành cho sets chỉ đọc và có thể thay đổi.
- class collections.abc.Mapping¶
- class collections.abc.MutableMapping¶
ABC dành cho mappings chỉ đọc và có thể thay đổi.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
ABC để ánh xạ, mục, khóa và giá trị views.
- class collections.abc.Awaitable¶
ABC cho các đối tượng awaitable, có thể được sử dụng trong biểu thức
await. Việc triển khai tùy chỉnh phải cung cấp phương thức__await__().Các đối tượng Coroutine và các phiên bản của
CoroutineABC đều là các phiên bản của ABC này.Ghi chú
Trong CPython, các coroutine dựa trên trình tạo (generators được trang trí bằng
@types.coroutine) là awaitables, mặc dù chúng không có phương thức__await__(). Sử dụngisinstance(gencoro, Awaitable)cho chúng sẽ trả vềFalse. Sử dụnginspect.isawaitable()để phát hiện chúng.Added in version 3.5.
- class collections.abc.Coroutine¶
ABC cho các lớp tương thích với coroutine. Chúng triển khai các phương thức sau, được xác định trong Đối tượng Coroutine:
send(),throw()vàclose(). Việc triển khai tùy chỉnh cũng phải triển khai__await__(). Tất cả các phiên bảnCoroutinecũng là phiên bản củaAwaitable.Ghi chú
Trong CPython, các coroutine dựa trên trình tạo (generators được trang trí bằng
@types.coroutine) là awaitables, mặc dù chúng không có phương thức__await__(). Sử dụngisinstance(gencoro, Coroutine)cho chúng sẽ trả vềFalse. Sử dụnginspect.isawaitable()để phát hiện chúng.Xem Trình tạo chú thích và coroutine để biết chi tiết về cách sử dụng
Coroutinetrong chú thích loại. Phương sai và thứ tự của các tham số loại tương ứng vớiGenerator.Added in version 3.5.
- class collections.abc.AsyncIterable¶
ABC cho các lớp cung cấp phương thức
__aiter__. Xem thêm định nghĩa của asynchronous iterable.Added in version 3.5.
- class collections.abc.AsyncIterator¶
ABC cho các lớp cung cấp phương thức
__aiter__và__anext__. Xem thêm định nghĩa của asynchronous iterator.Added in version 3.5.
- class collections.abc.AsyncGenerator¶
ABC dành cho các lớp asynchronous generator triển khai giao thức được xác định trong PEP 525 và PEP 492.
Xem Trình tạo chú thích và coroutine để biết chi tiết về cách sử dụng
AsyncGeneratortrong chú thích loại.Added in version 3.6.
- class collections.abc.Buffer¶
ABC cho các lớp cung cấp phương thức
__buffer__(), triển khai buffer protocol. Xem PEP 688.Added in version 3.12.
Ví dụ và Bí quyết¶
ABC cho phép chúng ta hỏi các lớp hoặc phiên bản xem chúng có cung cấp chức năng cụ thể hay không, ví dụ:
kích thước = Không có
nếu isinstance(myvar, Collection.abc.Sized):
kích thước = len(myvar)
Một số ABC cũng hữu ích như các mixin giúp phát triển các lớp hỗ trợ API vùng chứa dễ dàng hơn. Ví dụ: để viết một lớp hỗ trợ Set API đầy đủ, chỉ cần cung cấp ba phương thức trừu tượng cơ bản: __contains__(), __iter__() và __len__(). ABC cung cấp các phương thức còn lại như __and__() và isdisjoint():
lớp ListBasedSet(collections.abc.Set):
''' Triển khai tập thay thế ưu tiên không gian hơn tốc độ
và không yêu cầu các phần tử đã đặt phải có thể băm được. '''
def __init__(tự, có thể lặp lại):
self.elements = lst = []
cho giá trị trong iterable:
nếu giá trị không có trong lst:
lst.append(giá trị)
chắc chắn __iter__(tự):
trả về iter(self.elements)
def __contains__(bản thân, giá trị):
giá trị trả về trong self.elements
chắc chắn __len__(tự):
trả về len(self.elements)
s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
chồng chéo = phương thức s1 & s2 # The __and__() được hỗ trợ tự động
Lưu ý khi sử dụng Set và MutableSet làm mixin:
Vì một số thao tác tập hợp tạo tập hợp mới nên các phương thức mixin mặc định cần một cách để tạo các phiên bản mới từ iterable. Hàm tạo của lớp được giả sử có chữ ký ở dạng
ClassName(iterable). Giả định đó được đưa vào mộtclassmethodnội bộ có tên là_from_iterable()gọicls(iterable)để tạo ra một bộ mới. Nếu mixinSetđang được sử dụng trong một lớp có chữ ký hàm tạo khác, bạn sẽ cần ghi đè_from_iterable()bằng một phương thức lớp hoặc phương thức thông thường có thể tạo các phiên bản mới từ một đối số có thể lặp lại.Để ghi đè các so sánh (có lẽ là về tốc độ, vì ngữ nghĩa đã được cố định), hãy xác định lại
__le__()và__ge__(), sau đó các thao tác khác sẽ tự động thực hiện tương tự.Mixin
Setcung cấp phương thức_hash()để tính giá trị băm cho tập hợp; tuy nhiên,__hash__()không được xác định vì không phải tất cả các bộ đều là hashable hoặc bất biến. Để thêm khả năng băm tập hợp bằng mixin, hãy kế thừa từ cảSet()vàHashable(), sau đó xác định__hash__ = Set._hash.
Xem thêm
OrderedSet recipe để biết ví dụ được xây dựng trên
MutableSet.