1. 벡터 # 1 보자 Vector2d 호환
시퀀스 생성자를위한 가장 좋은 방법은 모든 내장과 같은 생성자의 반복 가능한 인수로 데이터를 취할 시퀀스 유형 않습니다이다.
예 10-2. vector_v1.py : vector2d_v1.py에서 파생 된
에서 배열 수입 배열 수입 reprlib의 수입 수학 클래스 벡터 : 타입 코드 = ' D ' 데프 __init__ (자기, 구성 요소) : self._components = 배열 (self.typecode 부품) 데프 __iter__ (자기) : 리턴 ITER (self._components) #은 반복, 우리는 self._components의 반복자를 반환 할 수 있도록합니다. 데프 __repr__ (자기) : 성분 = reprlib.repr ( self._components) # 사용 reprlib.repr는 () self._components의 제한된 길이 표현을 얻을 수 있습니다. 구성 성분 = [components.find ( ' [ ' ) - 1 ] 창 ' 벡터 ({}) ' .format (성분) 데프 __str__ (자동) : 리턴 STR (튜플 (자체)) DEF __bytes__ (자기) 창 (바이트 ([ORD (self.typecode)]) + 바이트 (self._components)) 데프 __eq__ (자기, 기타) : 반환 튜플 (자기) == 튜플 (기타) 데프 __abs__ (자기) : 리턴 math.sqrt (합 (X * X 에 대한 X 의 자기)) # 우리는 구성 요소 FO 제곱의 합과 그의 SQRT을 계산한다. 데프 __bool__ (자기) : 반환 부울 (ABS (자체)) @classmethod 데프 frombytes (CLS, 옥텟) : 타입 코드 = CHR (옥텟 [0]) memv = memoryview (옥텟 [1 :]). 캐스팅 (타입 코드) 복귀 CLS (memv) "" " reprlib.repr 함수 출력의 길이를 제한하여 크거나 순환 구조의 안전 표현을 생성 문자열과 함께 컷을 표시하는 '...'. 에 repr () 역할 : 디버깅 "" " # 예 10-1. init__ 및 벡터 .__ repr__ .__ 벡터의 시험 "" " >>> 벡터 ([3.1, 4.2]) 벡터 ([3.1, 4.2]) >>> 벡터 ((3,4,5)) 벡터 ([3.0, 4.0, 5.0]) >>> 벡터 (범위 (10)) 벡터 ([0.0, 1.0, 2.0, 3.0, 4.0, ...]) "" "
2. 프로토콜 및 오리 타이핑
당신은 파이썬에서 완벽하게 작동 순서 유형을 작성하는 특별한 클래스에서 상속 할 필요가 없습니다; 당신은 순서 프로토콜을 이행 방법을 구현해야합니다.
객체 지향 프로그래밍의 컨텍스트에서 프로토콜은 문서가 아닌 코드에 정의 된 비공식적 인 인터페이스이다. 예를 들어, 파이썬에서 시퀀스 프로토콜은 단지 수반 __len__ 및 __getitem__ 방법. 모든 클래스의 스팸 표준 서명과 의미에 구현하는 방법이 사용될 수 있음은 어디 순서가 예상된다. 여부 스팸이의 서브 클래스 또는 그 무관하다; 모든 문제는 필요한 방법을 제공하는 것입니다.
예 10-3. 코드 예 1-1에서, 편의를 위해 여기에 재현
수입 컬렉션 카드 = collections.namedtuple ( ' 카드 ' , [ ' 계급 ' , ' 소송 ' ]) 클래스 FrenchDeck : 랭크 = STR (N) 에 대한 N 의 범위 (2, 11)] +리스트 ( ' JQKA ' ) 정장 = ' 스페이드 다이아몬드 클럽 하트 ' .split () 데프 __init__ (자기) : self._cards = [카드 (순위, 소송) 에 대한 소송 에서 self.suits 에 대한 순위 에 self.ranks] 데프 __len__ (자기) : 리턴 렌 (self._cards) DEF __getitem__ (자기 위치) 복귀 self._cards [위치]
FrenchDeck은하지 어디서나 코드에서 선언 된 경우에도, 시퀀스 프로토콜을 구현합니다. 모든 경험 파이썬 코더는보고가 있음을 이해할 것 입니다 이 서브 클래스하더라도, 시퀀스 객체를 . 우리는 말씀 입니다 이 때문에 일련의 동작 처럼, 그것은 중요한 것입니다.
이것은로 알려졌다 오리 입력 .
프로토콜은 비공식적, 강제 때문에 당신은 클래스가 사용되는 특정 컨텍스트를 알고 있다면, 당신은 자주, 프로토콜의 한 부분을 구현 멀리 얻을 수 있습니다. 예를 들어, 단지 __getitem__이 필요, 반복을 지원하기 위해; __len__ 제공 할 필요가 없다.
종료...