파이썬-09 마술 방법, 특징 및 반복자

# 제 IX 마법의 메서드, 속성 및 반복자 
# 9.1을 사용하면 3 파이썬 사용하지 않는 경우

# 9.2 생성자
초기화에 #의 __init__
개체가 소멸되기 전에 # __del__ 소멸자 호출을

# 9.2.1 재정의 일반 및 특수 공법을 기능
클래스 버드 :
는 def __init __ (자동) :
self.hungry = 진정한
DEF 식사 (셀프) :
: self.hungry IF
인쇄 ( '아아 아아 .....')
self.hungry = 거짓
다른 :
인쇄 ( '아니, 감사합니다 ')

클래스 SongBird 사용 (새) :
DEF의 __init __ (자동) :
#Bird .__은 init __ (자기) # 9.2.2이 추가되어야한다
(슈퍼) .__은 init __ ()
self.sound ='! 쿼크 '
DEF 노래 (자동) :
인쇄 (self.sound)
SB = SongBird 사용 ()
인쇄 (sb.sing ())
인쇄 (sb.eat ()) # 'SongBird 사용'개체 속성은 NO '배고픈'이
# 9.2.2 슈퍼 클래스 생성자 호출이 초기화 __ .__ #Bird (자체) 연결되지 않은

슈퍼 # 슈퍼를 사용하여 # 9.2.3 기능을 (). __ __init ()

# 9.3 요소 액세스
# 9.3.1 기본 순서와 매핑 프로토콜은

DEF (키) check_index :
'' '
지정된 키 인덱스가 허용?

키는 허용, 음이 아닌 정수 여야합니다. 없는 정수 TypeError 예외 경우는 그 음성의 개시제 IndexError 예외이면 (시퀀스의 길이가 무한대이기 때문에)

'' '
이 아닌 경우 isinstance (키, INT) :
레이즈 형식 오류
IF 키 <0 :
들기 IndexError의

클래스 ArithmeticSequence :
는 def __init __ (자기 시작 = 0 스텝 = 1.)
'' '
연산 시퀀스를 초기화

: PARAM 시작 : 최초 값을 순서대로
: PARAM 단계 : 두 개의 인접한 가치의 차이
'
= 시작 self.start의
self.step = STEP
self.changed = {}
는 def __getitem __ (자체, 키)
'' '
연산 소자 시퀀스로부터 얻어지는
' '
check_index (키)
은 try :
복귀 self.changed하는 열쇠
KeyError를 제외한 :
리턴 self.start + 키 * self.step

DEF __setitem __ (자체, 키, 값) :
''
변형 된 연산 소자 시퀀스
''

check_index (키)

self.changed [KEY = 값

A = ArithmeticSequence (5 ,. 6).
인쇄 (A를 [5.])

#리스트, 및 딕셔너리의 STR로부터 유도 9.3.2

클래스 CounterList (목록)
는 def __init를 __ (자기 * 인수) :
슈퍼 () .__ 초기화 __ (* 인수)
self.counter = 0
는 def __getitem __ (자기 인덱스)
. self.counter + = 1
리턴 슈퍼 (CounterList,자가) .__의 getItem __ (인덱스)

CL = CounterList (범위 (10))
인쇄 (CL)
인쇄 (cl.counter)
CL [4] + CL [2]
인쇄 (cl.counter)

당신이 특별한 방법 이름의 수동 파이썬 참조 "를 참조하시기 바랍니다 더 배우고 다른 마법 방법을 필요로하는 경우 # 9.4 #.

# 9.5 액세스 방법에 의해 정의 된 특성들은 특성 특성이라
'' '
: 클래스 사각형
는 def __init __ (자기)
self.width = 0
self.height = 0
DEF set_size (자체 크기)
self.width, self.height = 크기
DEF GET_SIZE (자동) :
리턴 self.width, self.height

= 사각형 R & LT ()
r.width = 10
r.height에. 5 =
인쇄 (r.get_size ())
r.set_size ((150, 100))
프린트 (r.width)
'' '
# 9.5.1 기능 속성
클래스 사각형 :
는 def __init __ (자기)
self.width = 0
self.height = 0
DEF set_size (자체 크기)
self.width, self.height 크기 =
DEF GET_SIZE (자기)
복귀 self.width, self.height의
크기 = 속성 (GET_SIZE, set_size)

R & LT = 사각형 ()
r.width = 10
r.height에. 5 =
인쇄 (r.size)
r.size = 150 (100)
전단 (r.width)
'' '
기능 속성을 호출하지 수도 파라미터를 지정하는 지정 파라미터, 파라미터 지정 서너 파라미터 지정.
당신이 매개 변수를 지정하지 않으면 기능을 둘 다 읽거나 쓰기됩니다 만들 수 있습니다.
당신은 단지 하나의 매개 변수 (취득 방법)를 지정하면, 속성은 읽기 전용 될 것입니다 만들었습니다.
세번째 매개 변수는 선택적이다 (이 방법은, 파라미터를 접수하지 않음) 속성을 제거하기 위해 사용되는 방법을 지정한다.
네 번째 매개 변수는 선택 사항입니다, 문서 문자열을 지정합니다. 이러한 매개 변수는 fget, FSET, 프델 및 문서 이름이 지정됩니다.
당신이 쓰기 전용 문서와 속성의 문자열을 만들려면, 그들은 중요한 매개 변수로 구현 될 수있다.
하우투 가이드 설명자 (https://docs.python.org/3/howto/descriptor.html
'' '
# 9.5.2 정적 메소드와 클래스 메소드
# 정적 메소드와 클래스 메소드가이 방식으로 만들어집니다 그들은 StaticMethod를 포장하는 classmethod 및 객체 클래스.
정의 # 정적 메소드에 파라미터 자체를 취하지 않는다는 직접 클래스 클래스에 의해 호출 될 수있는
자체 유사한 파라미터 일반적이라는 CLS 이루어지는 정의 # 방법. 클래스 메소드도 될 수있다 개체 직접 호출하지만, 매개 변수 CLS가 자동으로 클래스에 연결. ''
'
MyClass 클래스 :
DEF smeth () :
인쇄 ('이것은 정적 방법 ')
smeth = StaticMethod를 (smeth)

DEF cmeth (CLS) :
인쇄 ('이 IS의 방법 A 클래스 'CLS)
cmeth = A classmethod (cmeth)
' ''
지정된 경우 # 데코레이터 장식 복수 나열된 애플리케이션 순서와 반대)
MyClass 클래스 :
@staticmethod
DEF smeth () :
인쇄 ( "정적 메소드이 IS A ')
@classmethod
DEF cmeth (CLS)
프린트 ( "IS이 클래스 A 법 'CLS)

인쇄 (MyClass.smeth ())
프린트 (MyClass.cmeth ())

# * 9.5.3 __getattr __ __ 같은 setattr__
' '
. 1 __ __ getAttribute를 (자기 이름) : 속성이 자동으로 호출에 액세스 할 때 (새로운 클래스에만 적용).
2, __ getattr __ (자기, 이름) : 자동 속성에 액세스 할 때 호출되고 객체는 그러한 속성입니다 없습니다.
3, __ 않은 setattr __ (자기, 이름, 값) : 속성 할당을 제공 할 때 자동으로 호출됩니다.
4, __ delattr __ (자기, 이름) : 삭제 속성을 시도 할 때 자동으로 호출.
''


# 9.6 반복자 __iter__
# 9.6.1 __iter__ 반복자 프로토콜은 다음 (IT) __next__하는 방법 반복자 객체를 반환하며 포함 .__ 다음 __ () 등가
클래스의 FIB :
DEF __init __ (자기)
self.a = 0
self.b = 1
DEF __next __ (자기)
self.a, self.b = self.b, self.a + self.b
반환 self.a
DEF __iter __ (자기) :
창 자체

의 FIB = FIB를 ()
의 FIB에서 F를 들어
잉크 (F)
: F> 1,000 경우
휴식

# 9.6.2从迭代器创建序列
클래스 TestIterator :
값 = 0
DEF __next __ (자기)
self.value + = 1
경우 self.value> 10 :
인상 대하여 StopIteration
반환 self.value
데프 __iter __ (자기) :
반환 자기
TI = TestIterator ()
인쇄 (목록 (TI))

# 9.7 함수 발생기 수율 문 발생기라고 포함하는
발전기를 만들기 # 9.7.1
''
DEF 패턴 화 된 (중첩 된)
서브리스트에 대한 중첩 :
요소의 하위 목록 :
수율 요소
. 중첩 = [(1, 2) .], [3 ,. 4], [5].

인쇄 (목록 (패턴 화 된 (중첩 된)))
프린트 (패턴 화 된 (중첩 된))
'' '
# * 9.7.2 재귀 발생기
' '
DEF 패턴 화 된 (중첩 된)
은 try은 :
# 비슷한 문자열을하지 반복 가능 객체
은 try를 :
중첩 + ''
형식 오류를 제외하고는 :
패스
다음 다른
인상의 형식 오류를
하위 목록에 중첩 위해를 :
: 패턴 화의 요소 (하위 목록)에 대한
수율 요소
형식 오류 제외 :
수율 중첩
인쇄 (목록 (패턴 화 ([... [1] 2 ,. 3 'AS',. 4 [5- [6 ,. 7 'SD'] ,. 8])))
'' '
반복자 생성 함수 및 생성 : 생성 9.7.3 일반 # 생성기는 두 개의 분리 된 부분으로 구성된다.
문 데프 함수 발생기 번호는 수율을 포함하는, 정의된다. 반복자 발생기는이 함수의 결과가 반환

# 빌더 9.7.4 방법
( "메시지"전송하기를 접근 방법 발전기 보내 외부 세계는,이 방법은 다음과 유사하지만, 매개 변수를 받아 들인다 : #의 외부 세계를 그것은) 어떤 객체가 될 수 있습니다.
빌더 # : 내부 발전기 보류, 수율은 표현보다는 문으로 사용될 수있다. 즉, 발전기가 다시 실행되는 경우,
#은 항복 값을 반환 - 송신을 통해 외부 세계로부터 전송 된 값입니다. 다음에 사용하는 경우, 수율이 없음을 반환하지 않습니다.
'' '
방법 던져 : 예외가 (수율 표현에서) 빌더 발생하는 예외를 제공 할 때 호출 유형, 옵션 값과 역 추적 객체입니다.
방법은 가까운 : 당신이 호출 할 때 인수를 제공하지 않고, 발전기를 정지합니다.
''

# 9.7.5 시뮬레이션 발전기
DEF 패턴 화 된 (중첩 된)
결과 = []
시도 :
# 유사한 문자열하지 반복 가능 객체
시도 :
+ 중첩 ''
형식 오류 제외 :
패스
다른 사람을 :
들기 형식 오류를
하위 목록에 중첩을 위해 :
: 패턴 화의 요소 (하위 목록)에 대한
result.append (요소)
형식 오류 제외 :
result.append을 (중첩)
반환 결과
. 인쇄 (펼치기 ([[[(1) ] 2 ,. 3 'AS',. 4 [. 5 [. 6 ,. 7 'SD'] ,. 8))

# 여덟 퀸 9.8



''
서열과 실질적으로 매핑 요소 (아이템) 중 기본적인 행동 (프로토콜)을 달성하기 위해 설정, 두 가지 불변의 객체는 방법, 네 변경 가능한 객체를 구현하는 필요를 구현해야합니다.
1, __ (자기) __ 렌 : - 대수 값 집합의 항목 수를 포함한다 이러한 방법 되돌아가 그 시퀀스의 요소 수 인 매핑이 결합된다. __len__는 0을 반환하는 경우
(이 행동 __nonzero__의 범위를 달성하지 않음), 객체가 거짓으로 간주된다 (빈리스트, 터플, 문자열과 사전 등) 부울 컨텍스트에있을 것입니다.
2, __의 getItem __ (자기, ) 키 :이 방법은 지정된 키와 관련된 값을 반환해야합니다. 시퀀스 키는 (후술하는 네거티브 일 수있다) 0 ~ N-1의 정수이어야
여기서 n은 시퀀스의 길이이다. 매핑, 키는 어떤 유형이 될 수 있습니다.
3, setitem __ __ (자체, 키 값) : 이 방법은 저장된 관련된 키 값 __getitem__ 얻기 위해 나중에 사용될과 연관되어야한다. 물론, 변경 가능한 객체는이 메소드를 구현해야하는 경우에만.
4, delitem __ __ (자체, 키) : 오브젝트의 조성물 __del__ 문을 사용하면이 메소드가 호출되고, 키와 관련된 값을 삭제한다. 마찬가지로, 개체 변수 (그리고 그 항목이 삭제됩니다 수) 경우에만
에만이 방법을 구현해야합니다.

키가 음이면 정수  시퀀스를 들어, 숫자는 단부를 전달한다. 즉, X가 [-n]는 [LEN (X) -N] X 등가이어야한다.
키 입력  부적절 (예를 들어, 스트링 키 시퀀스를 사용하여), 예외 형식 오류 경우가 있습니다.
 시퀀스 인덱스 유형이 올바르지 만 범위 IndexError 예외를 유발하는 것이 허용되지 않는 경우.
9.9 요약
 새로운 클래스와 기존 클래스 : 파이썬이 변화하는 방식으로 작업 클래스입니다. 파이썬 2의 최신 버전은, 두 개의 클래스가, 기존의 클래스는 무대를 떠나 신속하게된다.
새로운 클래스는 파이썬 2.2에 도입되어, 이러한 슈퍼과 재산 지원 기능과 같은 몇 가지 추가 기능을 제공하지만, 기존의 클래스는 지원하지 않습니다. 직접 또는 간접적으로, 개체 또는 세트 __metaclass__ 상속해야 새 클래스를 만듭니다.
 마법 : 이름 시작과 끝 두 개의 밑줄 파이썬, 특별한 방법이 많이 있습니다. 이러한 방법의 기능은 다양하지만, 대부분 특정 상황에서 파이썬에 의해 자동으로 호출. 객체를 만든 후 예를 들어, __init__가 호출됩니다.
 생성자 : 대부분의 객체 지향 언어는 당신이 쓴하는 각 클래스의 생성자를 가지고, 당신은 그것을 위해 생성자를 구현해야 할 수도 있습니다. 객체를 만든 후 __init__라는 이름의 생성자가 자동으로 호출된다.
 재기록 : 수퍼 (및 기타 속성) 서형에 정의 된 방법은, 본 방법은 이러한 목적을 위해 구현 될 수있다. 직접 슈퍼 클래스를 호출하여, 다시 작성된 버전을 호출하려면 연결되지 않은 버전 (이전 형)도 함수 슈퍼 (새 카테고리)를 호출하는 데 사용할 수 있습니다.
 순서 및지도 : 당신이 __getitem__ 및 __setitem__ 및 기타 마법의 방법을 포함한 모든 방법을 지정된 순서와 매핑 프로토콜을 구현해야합니다, 사용자 정의 시퀀스 또는 매핑을 만듭니다. 목록 (또는 UserList에) 및 딕셔너리 (또는 UserDict를)에서 파생하여 작업 부하를 많이 줄일 수 있습니다.
 반복자 간단히 반복기로서 오브젝트 __next__있어서, 반복 사용이 될 수있는 값의 집합. 이 경우없이 대체 반복법 __next__ StopIteration을 예외 이상의 값을 초래할 것이다. 반복 가능 객체 방법으로서 __iter__는
그 반복자 같은 시퀀스가 동일한 루프에 사용될 수 리턴한다. 전형적으로, 상기 반복기의 반복, 즉 반복기 자체를 포함하는 방법도 __iter__ 반환한다.
 발전기 : 함수 발생기 함수를 키워드 수율되어 포함 된 반환 반복자의 특별한 종류가 호출 될 때 발전기. 던져 가까운 방법이 보내 사용하여 활성과 상호 작용 생성합니다.
 팔 여왕의 문제 : 여덟 여왕의 문제는 발전기가 쉽게 해결할 수 있습니다 사용, 컴퓨터 과학의 유명한 문제이다. 보드에 팔 여왕을 배치하고, 두 개의 왕비가 서로를 공격하지 수 있도록하는 문제.

ITER (obj가) 반복 가능 객체의 반복자를 만들기 위해
다음 (IT) 추가 및 전에 반복자에 다음 요소를 반환
재산 (fget, FSET, 프델, 문서) 특성을 반환 모든 매개 변수는 선택 사항입니다
(클래스 슈퍼 , OBJ)는 슈퍼 클래스의 관련 인스턴스를 반환
'' '을


추천

출처www.cnblogs.com/fuyouqiang/p/11844650.html