마법

파이썬 구현 클래스의 마법을 많이, 여기에 요약 될 수있다.

 

__요구__

메소드가없이 호출 될 때 명시 적으로 메소드의 이름을 쓰기

클래스 학생 (객체) :
     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__

 

계속하려면 ...

추천

출처www.cnblogs.com/yanshw/p/10700538.html