파이썬은 마술 방법으로 많은 일을합니다. 그리고 이들 대부분은 일부 프로토콜의 일부입니다. 나는 "iterator protocol"과 "number protocol"에 익숙하지만 최근에는 "sequence protocol"이라는 용어를 우연히 발견했다. 그러나 일부 연구를 한 후에도 "시퀀스 프로토콜"이 무엇인지 정확히 알지 못합니다.파이썬의 시퀀스 프로토콜이란 무엇입니까?
예를 들어 C API 함수 PySequence_Check
은 "개체에"시퀀스 프로토콜 "이 구현되는지 확인합니다 (문서에 따라). source code이는 딕셔너리 아니다 클래스가 있음을 나타냅니다하지만 iter
에 대한 설명서도 나와 무엇을 약으로 동일한 __getitem__
방법을 구현
[...] 시퀀스 프로토콜을 지원해야합니다 (
__getitem__()
0에서 시작하는 정수 인자)와 방법. [...]
그러나 0
로 시작하는 요구 사항은 PySequence_Check
에서 "구현"뭔가 아니다.
은 다음 또한 기본적으로 인스턴스가 __reversed__
, __contains__
, __iter__
및 __len__
를 구현해야 말한다 collections.abc.Sequence
유형이있다.
그러나이 정의에 따르면 "시퀀스 프로토콜"을 구현하는 클래스는 반드시 시퀀스 일 필요는 없습니다 (예 : "data model"). 시퀀스에는 길이가있는 추상 클래스가 있습니다. 그러나 __getitem__
(PySequence_Check
전달)을 구현하는 클래스는 len(an_instance_of_that_class)
을 사용할 때 예외를 throw합니다.
누군가가 시퀀스와 시퀀스 프로토콜 (소스 코드를 읽는 것 외에도 프로토콜에 대한 정의가있는 경우)과 어떤 정의를 사용할 지의 차이점을 명확히 해 주실 수 있습니까?
'collections.abc.Sequence'에는'__getitem__'과'__len__'이 (가) 필요합니다. 그 외 모든 것에 믹스 인 방법이 있습니다. 반복에 대해서'__iter__'없이 '__getitem__' 만 정의되면, 내장 iter는 인덱스 0에서 시작하는 간단한 반복자를 인스턴스화합니다.'reversed'가 작동하려면'__len__'도 정의되어야합니다. 마지막 색인에서 시작할 수 있습니다. – eryksun
@eryksun 그러나 클래스는 ('PySequence_Check'에 관한 한) 시퀀스 프로토콜을 구현하기 위해'__len__'을 필요로하지 않습니다. 그리고'__len__'과'__getitem__'을 구현하지만'collections.abc.Sequence'를 상속받지 않는 클래스는 isinstance (an_instance, Sequence)를 전달하지 않습니다. 그것이 내 질문을 유발 한 것입니다. :) – MSeifert