파이썬 구현 클래스의 마법을 많이, 여기에 요약 될 수있다.
__요구__
메소드가없이 호출 될 때 명시 적으로 메소드의 이름을 쓰기
클래스 학생 (객체) : DEF __init__ (자기 이름) : self.name = 이름 DEF의 m (자동) : 인쇄 (3. ) DEF __call__ (자동) : self.data . = 3 인쇄 ( ' 내 이름은 % S. IS ' % self.name) S = 학생 ( ' 마이클 ' ) SM () # . 3의 이름을 작성하는 방법을 도시 S ()를 # 내 이름은 마이클. 메소드의 이름을 표시하지 않고 작성하는 것
__dict__
코드의 의미를 참조하십시오
클래스 B (객체) foo는 = 1.3 인쇄 (B.의 __dict__ ) # 类属性 # { '__dict__'<속성 'B'오브젝트 '__dict__'> # '__module__' '__main__' # '갑' 1.3 '__weakref__'< 'B'객체 속성 '__weakref__'> '__doc__'없음} B = B () 인쇄 나. __dict__ # {} #属性实例 b.bar = 13 잉크 B. __dict__ # { '바': 13} 인쇄 나. __dict__ 속성 이름을 포함 딕셔너리 유형, 반환 값 #는 인스턴스 제외한 __dict__ 스토리지 클래스 클래스 방법 속성 #의 등록 방법은 저장 인스턴스의 일례를 __dict__ 클래스는이 점을 포함하지 않는다 참고. 인쇄 디렉터리 (B) 인쇄 디렉터리 (B)를 # ## # 디렉터리 만 속성 값을 포함한 목록을 반환 # 디렉터리 개체의 모든 속성을 반환합니다
__getattr__
존재하지 않는 속성과 메서드를 액세스 할 때, 메소드 __getattr__를 호출
# 액세스 존재하지 않는 속성 클래스 학생 (객체) : DEF __init__ (자동) : self.name = ' 마이클 ' DEF의 __getattr__는 (자체, ATTR) : IF ATTR == ' 점수 ' : 반환 99 S = 학생 () 인쇄 S를 .name을 # '마이클' 인쇄 s.score # 99 # 존재하지 않는 속성이 어디에서 찾을 getattr에 인쇄 ST #의 None을 반환 찾을 getattr 없음 #을, 오류 #의 접근 방법이 존재하지 않습니다 클래스 학생 (객체) : DEF __getattr__ (자체는, ATTR) : IF ATTR == ' 나이 ' : 반환 람다를 : 25 #은 함수에 대한 참조를 반환 S = 학생 () 인쇄 s.age () # 25 # 방법도 getattr됩니다 보고에서,하지만 방법은 함수에 대한 참조를 반환해야한다는 것을 발견 인쇄 s.age의 # <0x026672B0 AT 기능 <람다>> #의 주는, Callable 객체가 아닌 'NoneType'인쇄 s.ss () #의 형식 오류를
__getattribute__
부동산 인터셉터
파이썬에서, 모든 클래스는 객체로부터 상속해야합니다, 개체 속성 및 방법은 내장, 우리의 사용자 정의 클래스가 자연적으로 이러한 속성과 메서드를 상속을 많이 가지고 있지만, 이러한 방법은 거의 속성을 사용하지, 많은 재산 방법 사용자가 사용하도록 다시 작성해야, __ getattribute__ 그들 중 하나입니다.
코드 첫
클래스 학생 (객체) : 나라 = " 중국 " DEF __init__ (자체, 이름, 나이) : self.name = 이름 self.age = 나이 DEF의 __getattribute__ (자체, ATTR) : #의 주 : ATTR 이름이 전달되는 속성, 값이없는 속성 인쇄 ( " 속성 차단 확인 기능 시작 " ) 인쇄 (ATTR) 반환 개체. __getattribute__가 (자기가 ATTR) #은 속성 값 반환 S1 = 학생 ( " 톰 " . 19 ) 인쇄(Student.country는, s1.country, s1.name, s1.age) #이 속성을 호출 방법은 __getattribute__ 호출 #이 확인 속성 차단 기능을 시작 # 나라 #이 기능을 차단 확인 속성을 시작 #의 이름 #이 속성을 확인 시작 기능 차단 #의 시대 # ( '중국', '중국', '톰', 19)
1. 당신은 우리가 __getattribute__를 다시 썼다 것을보고, 객체의 메소드를 반환 할 수 있습니다
이 인스턴스 메서드이기 때문에 2 속성 클래스는, 인터셉터, 속성을 통해 요격 인스턴스 속성없이 속성 (Student.country 출력 없음 '확인 ... 속성을 시작하기 ")
3. __getattribute__는 사용자 정의 수익을 달성하기 위해 쓸 수있다
재정의 속성 인터셉터
클래스 학생 (객체) : 나라 = " 중국 " DEF __init__ (자체, 이름, 나이) : self.name = 이름 self.age = 나이 DEF의 __getattribute__ (자체, ATTR) : #의 주 : ATTR 이름이 전달되는 속성, 하지 않는 속성 값 인쇄 ( " 확인 속성 기능을 차단 시작 " ) 인쇄 (ATTR) IF ATTR == " 이름 " : #의 자기없이 원래의 속성 이름을 참조하는 참고, 직접 인용 할 수있다. 인쇄 ( " 지금 name 속성이라고합니다 " ) ELIF ATTR == " 나이 " : 인쇄 ( " 나이 속성이 변경됩니다 " ) self.age = 1000 수익 5555 # 이 돌아 오면 더 수익이없는 경우는, 1000 다시 반환 다른 : 인쇄 ( " 지금 다른 속성을 호출 " ) 반환 개체입니다. __getattribute__가 (자기가 ATTR) #은 속성 이름 반환 S2 = 학생 ( " 톰 " . 19 ) 인쇄 (s2.name, s2.age, s2.country을) #기능 차단 속성 검사를 시작 #의 이름을 #을 이제 이름 속성 호출 시작 #을 기능 차단 속성을 확인하기 시작 # 연령 #의 나이 속성이 변경됩니다 # 기능 차단 확인 속성을 시작 #의 국가 #을 이제 다른 속성 전화 #을 '( 톰 ', 1000'중국 ' )
당신은 세 속성이 변경 볼 수 있습니다.
__getitem__ 및 __setitem__
상기 방법은 클래스 정의되면, 다음의 클래스 인스턴스는, 예컨대 값 C를 될 수 키]의 클래스의 경우 의 예를 실행 C [키] 계산 방법 __getitem__ 불린다.
클래스 S (객체) DEF __init__ (자기) self.s = 3 DEF __getitem__ (자기, 상품) : 리턴 self.s DEF __setitem__ (자체, 키 값) : 않은 setattr (자체, 키 값) (S) = 용 S () 인쇄 S [ ' ' ] # 3 의 [ ' S ' = 100 출력 (S [ ' S ' ]) # 100
이것이의 getItem 시간에 쓸 상대적으로 간단합니다 상관없이 항목이 무엇인지, self.s을 반환하지 않으므로의 [ 'a는'] 3 반환, 초점은 사용을 이해하는 것입니다.
__slots__ 槽
__str__ 및 __repr__
계속하려면 ...