# `collections.abc` — 컨테이너의 추상 베이스 클래스

버전 3.3에 추가: 이전에는, 이 모듈이 `collections` 모듈의 일부였습니다.

소스 코드: Lib/_collections_abc.py

이 모듈은 클래스가 특정 인터페이스를 제공하는지를 검사하는 데 사용할 수 있는 추상 베이스 클래스를 제공합니다; 예를 들어, 해시 가능한지 또는 매핑인지입니다.

## Collections 추상 베이스 클래스

collections 모듈은 다음과 같은 ABC를 제공합니다:

ABC | 상속 | 추상 메서드 | 믹스인 메서드
--- | --- | --- | ---
`Container` |  | `__contains__` |
`Hashable` |  | `__hash__` |
`Iterable` |  | `__iter__` |
`Iterator` | `Iterable` | `__next__` | `__iter__`
`Reversible` | `Iterable` | `__reversed__` |
`Generator` | `Iterator` | `send`, `throw` | `close`, `__iter__`, `__next__`
`Sized` |  | `__len__` |
`Callable` |  | `__call__` |
`Collection` | `Sized`, `Iterable`, `Container` | `__contains__`, `__iter__`, `__len__` |
`Sequence` | `Reversible`, `Collection` | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` 및 `count`
`MutableSequence` | `Sequence` | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | 상속된 `Sequence` 메서드와 `append`, `reverse`, `extend`, `pop`, `remove` 및 `__iadd__`
`ByteString` | `Sequence` | `__getitem__`, `__len__` | 상속된 `Sequence` 메서드
`Set` | `Collection` | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__` 및 `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` |  | `__len__`
`ItemsView` | `MappingView`, `Set` |  | `__contains__`, `__iter__`
`KeysView` | `MappingView`, `Set` |  | `__contains__`, `__iter__`
`ValuesView` | `MappingView`, `Collection` |  | `__contains__`, `__iter__`
`Awaitable` |  | `__await__` |
`Coroutine` | `Awaitable` | `send`, `throw` | `close`
`AsyncIterable` |  | `__aiter__` |
`AsyncIterator` | `AsyncIterable` | `__anext__` | `__aiter__`
`AsyncGenerator` | `AsyncIterator` | `asend`, `athrow` | `aclose`, `__aiter__`, `__anext__`

class `collections.abc.``Container`

  `__contains__()` 메서드를 제공하는 클래스의 ABC.

class `collections.abc.``Hashable`

  `__hash__()` 메서드를 제공하는 클래스의 ABC.

class `collections.abc.``Sized`

  `__len__()` 메서드를 제공하는 클래스의 ABC.

class `collections.abc.``Callable`

  `__call__()` 메서드를 제공하는 클래스의 ABC.

class `collections.abc.``Iterable`

  `__iter__()` 메서드를 제공하는 클래스의 ABC.

  `isinstance(obj, Iterable)`를 검사하면 `Iterable`로 등록되었거나 `__iter__()` 메서드가 있는 클래스를 감지하지만, `__getitem__()` 메서드로 이터레이트 하는 클래스는 감지하지 않습니다. 객체가 이터러블인지를 확인하는 유일하게 신뢰성 있는 방법은 `iter(obj)`를 호출하는 것입니다.

class `collections.abc.``Collection`

  길이가 있는 이터러블 컨테이너 클래스의 ABC.

  버전 3.6에 추가.

class `collections.abc.``Iterator`

  `__iter__()` 와 `__next__()` 메서드를 제공하는 클래스의 ABC. 이터레이터의 정의도 참조하십시오.

class `collections.abc.``Reversible`

  `__reversed__()` 메서드도 제공하는 이터러블 클래스의 ABC.

  버전 3.6에 추가.

class `collections.abc.``Generator`

  `send()`, `throw()` 및 `close()` 메서드로 이터레이터를 확장하는 PEP 342에 정의된 프로토콜을 구현하는 제너레이터 클래스의 ABC. 제너레이터의 정의도 참조하십시오.

  버전 3.5에 추가.

class `collections.abc.``Sequence`
class `collections.abc.``MutableSequence`
class `collections.abc.``ByteString`

  읽기 전용과 가변 시퀀스의 ABC.

  구현 참고 사항: `__iter__()`, `__reversed__()` 및 `index()`와 같은 일부 믹스인(mixin) 메서드는 하부 `__getitem__()` 메서드를 반복적으로 호출합니다. 따라서, `__getitem__()`이 상수 액세스 속도로 구현되면 믹스인 메서드는 선형 성능을 갖습니다; 그러나 하부 메서드가 선형이면 (링크드 리스트에서처럼), 믹스인은 2차 함수 성능을 가지므로 재정의해야 할 수 있습니다.

  버전 3.5에서 변경: index() 메서드는 stop과 start 인자에 대한 지원을 추가했습니다.

class `collections.abc.``Set`
class `collections.abc.``MutableSet`

  읽기 전용과 가변 집합의 ABC.

class `collections.abc.``Mapping`
class `collections.abc.``MutableMapping`

  읽기 전용과 가변 매핑의 ABC.

class `collections.abc.``MappingView`
class `collections.abc.``ItemsView`
class `collections.abc.``KeysView`
class `collections.abc.``ValuesView`

  매핑, 항목, 키 및 값 뷰의 ABC.

class `collections.abc.``Awaitable`

  `await` 표현식에서 사용할 수 있는 어웨이터블 객체의 ABC. 사용자 정의 구현은 `__await__()` 메서드를 제공해야 합니다.

  코루틴 객체와 `Coroutine` ABC의 인스턴스는 모두 이 ABC의 인스턴스입니다.

  참고

  CPython에서, 제너레이터 기반 코루틴(`types.coroutine()`이나 `asyncio.coroutine()`으로 데코레이트 된 제너레이터)은, `__await__()` 메서드가 없어도 어웨이터블 입니다. 이들에 대해 `isinstance(gencoro, Awaitable)`를 사용하면 `False`가 반환됩니다. 이들을 감지하려면 `inspect.isawaitable()`을 사용하십시오.

  버전 3.5에 추가.

class `collections.abc.``Coroutine`

  코루틴 호환 클래스의 ABC. 코루틴 객체(Coroutine Objects)에 정의된 다음 메서드를 구현합니다: `send()`, `throw()` 및 `close()`. 사용자 정의 구현은 `__await__()`도 구현해야 합니다. 모든 `Coroutine` 인스턴스는 `Awaitable`의 인스턴스이기도 합니다. 코루틴의 정의도 참조하십시오.

  참고

  CPython에서, 제너레이터 기반 코루틴(`types.coroutine()`이나 `asyncio.coroutine()`으로 데코레이트 된 제너레이터)은, `__await__()` 메서드가 없어도 어웨이터블 입니다. 이들에 대해 `isinstance(gencoro, Coroutine)`을 사용하면 `False`가 반환됩니다. 이들을 감지하려면 `inspect.isawaitable()`을 사용하십시오.

  버전 3.5에 추가.

class `collections.abc.``AsyncIterable`

  `__aiter__` 메서드를 제공하는 클래스의 ABC. 비동기 이터러블의 정의도 참조하십시오.

  버전 3.5에 추가.

class `collections.abc.``AsyncIterator`

  `__aiter__` 와 `__anext__` 메서드를 제공하는 클래스의 ABC. 비동기 이터레이터의 정의도 참조하십시오.

  버전 3.5에 추가.

class `collections.abc.``AsyncGenerator`

  PEP 525와 PEP 492에 정의된 프로토콜을 구현하는 비동기 제너레이터 클래스의 ABC.

  버전 3.6에 추가.

이러한 ABC들은 클래스나 인스턴스가 특정 기능을 제공하는지 묻는 것을 허용합니다, 예를 들어:

    size = None
    if isinstance(myvar, collections.abc.Sized):
        size = len(myvar)

ABC 중 일부는 믹스인으로도 유용하여 컨테이너 API를 지원하는 클래스를 쉽게 개발할 수 있게 합니다. 예를 들어, 전체 `Set` API를 지원하는 클래스를 작성하려면, `__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`을 믹스인으로 사용할 때의 주의 사항:

1. 일부 집합 연산은 새로운 집합을 만들기 때문에, 기본 믹스인 메서드는 이터러블로부터 새 인스턴스를 만드는 방법이 필요합니다. 클래스 생성자가 `ClassName(iterable)` 형식의 서명을 가진 것으로 가정합니다. 이 가정은 새로운 집합을 생성하기 위해 `cls(iterable)`를 호출하는 `_from_iterable()`이라는 내부 클래스 메서드로 분리되었습니다. `Set` 믹스인이 다른 생성자 서명을 갖는 클래스에서 사용되고 있으면, 이터러블 인자로부터 새 인스턴스를 생성할 수 있는 클래스 메서드로 `_from_iterable()`을 재정의해야 합니다.

2. 비교를 재정의하려면 (의미는 고정되었으므로, 아마도 속도 때문에), `__le__()`와 `__ge__()`를 재정의하십시오, 그러면 다른 연산은 자동으로 맞춰집니다.

3. `Set` 믹스인은 집합의 해시값을 계산하는 `_hash()` 메서드를 제공합니다; 그러나 모든 집합이 해시 가능하거나 불변이지는 않기 때문에 `__hash__()`는 정의되지 않습니다. 믹스인을 사용하여 집합 해시 가능성을 추가하려면, `Set()`와 `Hashable()`을 모두 상속한 다음, `__hash__ = Set._hash`를 정의하십시오.

더 보기

- `MutableSet`으로 구축한 예제 OrderedSet 조리법.

- ABC에 대한 자세한 내용은, `abc` 모듈과 PEP 3119를 참조하십시오.