프로토콜은 객체지향 프로그래밍에서 프로토콜은 문서에만 정의되어 있고 실제 코드엔 정의되지 않은 비공식 인터페이스이다.
예를 들어, 파이썬의 시퀀스 프로토콜은 len()과 getitem() 메서드를 동반하여 표준 시그니처와 의미에 따라서 이 메서드들을 구현하는 어떠한 클래스도 시퀀스가 필요한 곳에 사용될 수 있고, 그 클래스의 슈퍼 클래스가 무엇인지는 중요하지 않고 단지 필요한 메서드만 제공하면 된다.
import collections
Card = collections.nametuple("Card", ['rank','suit'])
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spaders diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits
for suit in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self,position):
return self._cards[position]
FrenchDeck 클래스는 시퀀스 프로토콜을 구현하므로 파이썬에서 제공하는 여러 기능을 활용할 수 있고, 코드 어디에서나 시퀀스 프로토콜을 따르는 정의가 없으므로 이 클래스가 object를 상속하고 있지만 파이썬 경험이 있는 프로그래머들은 코드를 본 후 시퀀스처럼 동작하므로 시권스라는 것을 알 수 있다.