collections.abc — 컨테이너의 추상 베이스 클래스¶
Added in version 3.3: 이전에는, 이 모듈이 collections 모듈의 일부였습니다.
소스 코드: Lib/_collections_abc.py
이 모듈은 클래스가 특정 인터페이스를 제공하는지를 검사하는 데 사용할 수 있는 추상 베이스 클래스를 제공합니다; 예를 들어, 해시 가능인지 또는 매핑인지입니다.
issubclass() 또는 isinstance() 테스트를 인터페이스에 하는 것은 세 가지 방식 중 하나로 작동합니다.
새로 작성된 클래스는 추상 베이스 클래스 중 하나를 직접 상속받을 수 있습니다. 이 클래스는 필요한 추상 메서드를 구현해야 합니다. 나머지 믹신 메서드는 상속으로부터 오며, 원하는 경우 오버라이드할 수 있습니다. 필요에 따라 다른 메서드를 추가할 수 있습니다.
class C(Sequence): # 직접 상속 def __init__(self): ... # ABC 가 요구하지 않는 추가 메서드 def __getitem__(self, index): ... # 필수 추상 메서드 def __len__(self): ... # 필수 추상 메서드 def count(self, value): ... # 선택적으로 믹스인 메서드를 재정의합니다
>>> issubclass(C, Sequence) True >>> isinstance(C(), Sequence) True
기존 클래스 및 내장 클래스는 ABC의 “가상 서브클래스”로 등록될 수 있습니다. 해당 클래스는 모든 추상 메서드와 모든 믹신 메서드를 포함하는 전체 API를 정의해야 합니다. 이를 통해 사용자는
issubclass()또는isinstance()테스트를 사용하여 전체 인터페이스가 지원되는지 여부를 확인할 수 있습니다. 이 규칙의 예외는 나머지 API로부터 자동으로 추론되는 메서드에 대한 것입니다.class D: # 상속 없음 def __init__(self): ... # ABC 가 요구하지 않는 추가 메서드 def __getitem__(self, index): ... # 추상 메서드 def __len__(self): ... # 추상 메서드 def count(self, value): ... # 믹스인 메서드 def index(self, value): ... # 믹스인 메서드 Sequence.register(D) # 상속하는 대신 등록합니다
>>> issubclass(D, Sequence) True >>> isinstance(D(), Sequence) True
이 예제에서 클래스
D는__contains__,__iter__, 및__reversed__를 정의할 필요가 없습니다. 왜냐하면 in-operator \, iteration \ 로직, 그리고reversed()함수가 자동으로__getitem__및__len__를 사용하도록 폴백하기 때문입니다.간단한 인터페이스는 필요한 메서드의 존재만으로 직접 식별할 수 있습니다 (해당 메서드가 :const:`None`으로 설정되지 않은 경우 제외).
class E: def __iter__(self): ... def __next__(self): ...
>>> issubclass(E, Iterable) True >>> isinstance(E(), Iterable) True
복잡한 인터페이스는 마지막 기법을 지원하지 않습니다. 왜냐하면 인터페이스는 단순히 메서드 이름의 존재 그 이상의 것이기 때문입니다. 인터페이스는 특정 메서드 이름의 존재만으로는 추론할 수 없는 메서드 간의 의미론과 관계를 지정합니다. 예를 들어, 클래스가
__getitem__,__len__, 및__iter__를 제공한다는 것을 아는 것은Sequence와Mapping을 구별하기에는 불충분합니다.
Added in version 3.9: 이러한 추상 클래스는 이제 [] 를 지원합니다. 자세한 내용은 제네릭 에일리어스 형 및 PEP 585 를 참조하십시오.
Collections 추상 베이스 클래스¶
collections 모듈은 다음과 같은 ABC를 제공합니다:
ABC |
상속 |
추상 메서드 |
믹스인 메서드 |
|---|---|---|---|
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|||
|
|||
|
|||
|
|
||
|
상속된 |
||
|
상속된 |
||
|
|
||
|
상속된 |
||
|
|
||
|
상속된 |
||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|
||
|
|||
|
|
||
|
|
||
|
각주
Collections 추상 베이스 클래스 – 상세한 설명¶
- class collections.abc.Container¶
__contains__()메서드를 제공하는 클래스의 ABC.
- class collections.abc.Hashable¶
__hash__()메서드를 제공하는 클래스의 ABC.
- class collections.abc.Callable¶
__call__()메서드를 제공하는 클래스의 ABC.타입 어노테이션에서
Callable사용법은 :ref:`annotating-callables`를 참조하십시오.
- class collections.abc.Iterable¶
__iter__()메서드를 제공하는 클래스의 ABC.isinstance(obj, Iterable)를 검사하면Iterable로 등록되었거나__iter__()메서드가 있는 클래스를 감지하지만,__getitem__()메서드로 이터레이트 하는 클래스는 감지하지 않습니다. 객체가 이터러블인지를 확인하는 유일하게 신뢰성 있는 방법은iter(obj)를 호출하는 것입니다.
- class collections.abc.Collection¶
길이가 있는 이터러블 컨테이너 클래스의 ABC.
Added in version 3.6.
- class collections.abc.Iterator¶
__iter__()와__next__()메서드를 제공하는 클래스의 ABC. 이터레이터의 정의도 참조하십시오.
- class collections.abc.Reversible¶
__reversed__()메서드도 제공하는 이터러블 클래스의 ABC.Added in version 3.6.
- class collections.abc.Generator¶
send(),throw()및close()메서드로 이터레이터를 확장하는 PEP 342에 정의된 프로토콜을 구현하는 제너레이터 클래스의 ABC.타입 어노테이션에서
Generator사용법은 :ref:`annotating-generators-and-coroutines`를 참조하십시오.Added in version 3.5.
- class collections.abc.Sequence¶
- class collections.abc.MutableSequence¶
- class collections.abc.ByteString¶
읽기 전용과 가변 시퀀스의 ABC.
구현 참고:
__iter__()\,__reversed__()\, 및__getitem__()메서드를 반복적으로 호출합니다. 결과적으로, 만약 :meth:`~object.__getitem__`이 상수 접근 속도로 구현되었다면, 믹신 메서드는 선형 성능을 가질 것입니다. 하지만 기본 메서드가 선형일 경우 (연결 리스트의 경우와 같이), 믹신은 이차 성능을 가지게 되므로 오버라이드가 필요할 가능성이 높습니다.- index(value, start=0, stop=None)¶
value 의 첫 번째 인덱스를 반환합니다.
값이 존재하지 않으면 :exc:`ValueError`를 발생시킵니다.
start 및 stop 인수를 지원하는 것은 선택 사항이지만 권장됩니다.
버전 3.5에서 변경:
index()메서드가 stop 및 start 인수를 지원하게 되었습니다.
버전 3.12에서 폐지되었고, 버전 3.17에서 제거됩니다:
ByteStringABC는 Deprecated되었습니다.실행 시간에 특정
obj\가 버퍼 프로토콜\을 구현하는지 확인하려면isinstance(obj, collections.abc.Buffer)\를 사용해주시기를 부탁드립니다. 타입 어노테이션(type annotation)에서 사용하시기를 원하는 경우Buffer\를 사용하거나, 코드에서 지원하는 타입을 명시적으로 지정한 유니언(예를 들어, bytes | bytearray | memoryview)을 사용해주시기를 부탁드립니다.ByteString`은 원래 :class:`bytes`와 :class:`bytearray모두의 슈퍼타입 역할을 할 추상 클래스로 의도되었습니다. 그러나 ABC는 어떤 메서드도 가지지 않았기 때문에, 객체가ByteString`의 인스턴스라는 사실만으로는 객체에 대해 유용하게 알려주는 것이 없었습니다. 다른 일반적인 버퍼 타입인 :class:`memoryview역시 :class:`!ByteString`의 하위 타입으로 이해되지 않았습니다(실행 시간이나 정적 타입 검사기 모두).더 자세한 내용은 :pep:`PEP 688 <688#current-options>`를 참고해주시기를 부탁드립니다.
- class collections.abc.MappingView¶
- class collections.abc.ItemsView¶
- class collections.abc.KeysView¶
- class collections.abc.ValuesView¶
매핑, 항목, 키 및 값 뷰의 ABC.
- class collections.abc.Awaitable¶
await표현식에서 사용할 수 있는 어웨이터블 객체의 ABC. 사용자 정의 구현은__await__()메서드를 제공해야 합니다.코루틴 객체와
CoroutineABC의 인스턴스는 모두 이 ABC의 인스턴스입니다.참고
CPython에서 제너레이터 기반 코루틴 (generators \에
@types.coroutine가 데코레이션된)은__await__()메서드를 가지고 있지 않더라도 awaitable 입니다. 이들을 위해isinstance(gencoro, Awaitable)를 사용하면False를 반환합니다. 이를 감지하려면inspect.isawaitable()을 사용하십시오.Added in version 3.5.
- class collections.abc.Coroutine¶
코루틴 호환 클래스의 ABC. 코루틴 객체(Coroutine Objects)에 정의된 다음 메서드를 구현합니다:
send(),throw()및close(). 사용자 정의 구현은__await__()도 구현해야 합니다. 모든Coroutine인스턴스는Awaitable의 인스턴스이기도 합니다.참고
CPython에서 제너레이터 기반 코루틴 (generators 데코레이터된
@types.Coroutine)은__await__()메서드가 없더라도 어웨이터블 입니다. 따라서 이를 감지하려면isinstance(gencoro, Coroutine)을 사용하는 것은False를 반환합니다. 대신inspect.isawaitable()를 사용하십시오.타입 어노테이션에서
Coroutine사용에 대한 자세한 내용은 :ref:`annotating-generators-and-coroutines`를 참조하십시오. 타입 매개변수의 가변성과 순서는 :class:`Generator`의 것과 일치합니다.Added in version 3.5.
- class collections.abc.AsyncIterable¶
__aiter__메서드를 제공하는 클래스의 ABC. 비동기 이터러블의 정의도 참조하십시오.Added in version 3.5.
- class collections.abc.AsyncIterator¶
__aiter__와__anext__메서드를 제공하는 클래스의 ABC. 비동기 이터레이터의 정의도 참조하십시오.Added in version 3.5.
예제와 조리법¶
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):
''' 속도보다 공간을 선호하고 집합 원소가
해시 가능할 필요가 없는 대안 집합 구현. '''
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 # __and__() 메서드는 자동으로 지원됩니다
Set과 MutableSet을 믹스인으로 사용할 때의 주의 사항:
일부 집합 연산은 새로운 집합을 만들기 때문에, 기본 믹스인 메서드는 이터러블로부터 새 인스턴스를 만드는 방법이 필요합니다. 클래스 생성자가
ClassName(iterable)형식의 서명을 가진 것으로 가정합니다. 이 가정은 새로운 집합을 생성하기 위해cls(iterable)를 호출하는_from_iterable()이라는 내부classmethod로 분리되었습니다.Set믹스인이 다른 생성자 서명을 갖는 클래스에서 사용되고 있으면, 이터러블 인자로부터 새 인스턴스를 생성할 수 있는 클래스 메서드나 일반 메서드로_from_iterable()을 재정의해야 합니다.비교를 재정의하려면 (의미는 고정되었으므로, 아마도 속도 때문에),
__le__()와__ge__()를 재정의하십시오, 그러면 다른 연산은 자동으로 맞춰집니다.Set믹스인은 집합의 해시값을 계산하는_hash()메서드를 제공합니다. 하지만 모든 집합이 hashable 하거나 불변이지는 않기 때문에__hash__()는 정의되지 않습니다. 믹스인을 사용하여 집합 해시 가능성을 추가하려면,Set과Hashable을 모두 상속한 다음,__hash__ = Set._hash를 정의해야 합니다.
더 보기
MutableSet으로 구축한 예제 OrderedSet 조리법.