덕 타이핑의 상징인 동적 프로토콜에서부터 인터페이스를 명시하고 구현이 인터페이스에 따르는지 검증하는 추상 베이스 클래스(ABC)에 이르기까지 다양한 곳에서 인터페이스가 사용된다.
인터페이스를 구현할 때 ABC가 슈퍼클래스로 널리 사용되는 것을 보여주고 구상 서브클래스가 자신이 정의한 인터페이스에 부합되는지 여부를 ABC가 언제 검사하는지와, 클래스를 상속하지 않고도 클래스가 인터페이스를 구현한다고 개발자가 선언할 수 있게 해주는 등록 메커니즘의 작동 방식을 알아보고, 상속하거나 명시적으로 등록하지 않고도 인터페이스에 부합하는 임의의 클래스를 자동으로 "인식"할 수 있게 ABC를 프로그래밍하는 방법을 설명한다.'
프로토콜은 파이썬과 같은 동적 자료형을 제공하는 언어에선 다형성을 제공하는 비공식 인터페이스
파이썬 언어에는 interface라는 키워드는 없지만, ABC에 상관없이 모든 클래스는 인터페이스를 가지고 있으며 클래스가 상속하거나 구현한 공개 속성들의 집합이 인터페이스이고 getitem() 이나 add() 같은 특별 메서드도 포함된다.
보호된 속성은 단지 명명 관례이고 비공개 속성도 쉽게 접근할 수 있으나 보호된 속성과 비공개 속성은 인터페이스에 속하지 않는다고 정의되어 있고 이 관례는 어기면 안된다.
#x와y는 공개 데이터 속성
class Vector2d:
typecode = 'd'
def __init__(self,x,y):
self.x = float(x)
self.y = float(y)
def __iter__(self):
return (i for i in (self.x, self.y))
#리팩토링
class Vector2d:
typecode = 'd'
def __init__(self,x,y):
self.x = float(x)
self.y = float(y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
def __iter__(self):
return (i for i in (self.x, self.y))
파이썬 문서에서 특정 클래스를 지정하지 않고 file과 같은 객체 혹은 반복형이라고 말할 때 의미하는 것으로 어떤 역할을 완수하기 위한 메서드 집합의 인터페이스를 스몰토크에서 프로토콜이라고 부르며, 다른 동적 언어 커뮤니티에도 퍼져나갔다.
참고로, 프로토콜은 상속과 무관하고 클래스는 여러 프로토콜을 구현해서 객체가 여러 역할을 할 수 있게 만들 수 있다.