Python 에서 자주 사용 하 는 마법 방법 을 자세히 설명 합 니 다.

9468 단어 python마법 법
1.python 마법 방법
Python 의 마법 방법 은 특정한 상황 에서 자동 으로 호출 되 며,그들의 방법 명 은 보통 두 밑줄 로 둘러싸 여 있 습 니 다.이전에 우리 가 배 운 구조 함수 와 분석 함 수 는 마법 방법 에 속 합 니 다.
2.연산 자 과부하
Python 에 도 연산 자 를 다시 불 러 옵 니 다.사실 모든 연산 자 는 해당 하 는 마법 방법 으로 처리 하 는 대상 입 니 다.마법 방법 에 대응 하 는 연산 자 는 다음 과 같 습 니 다.
在这里插入图片描述
간단 한 예 를 들 어 보 겠 습 니 다.

class A:
    def __init__(self,x):
        self.x = x
    def __add__(self,other):
        return int(self.x)+int(other.x)
a = A(3.3)
b = A(5.2)
print(a+b)
유사 한 것 은 반 연산 과부하 와 증 량 복제 연산 도 있 는데,용도 가 비교적 적어 더 이상 설명 하지 않 는 다.
在这里插入图片描述
在这里插入图片描述
3.인쇄 작업 의 마법 방법__str__(self):반환 값 은 str 형식 입 니 다.문자열 로 대상 을 출력 해 야 할 때(print 를 호출 할 때)이 방법 을 자동 으로 호출 합 니 다.예 를 들 어

class A:
    def __str__(self):
        return '   '

a = A()
print(a)#    
__repr__(self):반환 값 은 str 유형 입 니 다.우리 가 셸 에 대상 이름 을 직접 입력 하고 Enter 를 누 르 면 자동 으로 이 방법 을 호출 합 니 다.그 도__str__와 같은 기능 을 가지 고 있 습 니 다.그러나 둘 다 다시 쓰 면 print 를 사용 할 때__str__의 우선 순위 가 높 습 니 다.__repr__기계 에 보 여 주 는 것 입 니 다.__str__예 를 들 어 보 여 주 는 것 입 니 다.

>>> class A:
    def __str__(self):
        return '   '
    def __repr__(self):
        return '       '

>>> a = A()
>>> a
       
>>> print(a)
   
4.속성 조작의 마법 방법
  • __getattr__(self, name):사용자 가 존재 하지 않 는 속성 을 가 져 오 려 고 할 때 행동 을 정의 합 니 다.그 중에서 name 은 속성 명 이 고 문자열 입 니 다.아래 는 같 습 니 다
  • __getattribute__(self, name):이러한 속성 이 접근 할 때의 행 위 를 정의 합 니 다.이 방법 은 기본적으로 이 속성의 값 을 되 돌려 줍 니 다
  • __setattr__(self, name, value):하나의 속성 이 설정 되 었 을 때의 행 위 를 정의 합 니 다.value 는 이 속성 에 대한 값
  • 입 니 다.
  • __delattr__(self, name):속성 이 삭 제 될 때의 행동 을 정의 합 니 다
  • 예 를 들 면:
    
    class A:
        def __init__(self):
            self.id = "Pyhon"
        def __getattr__(self,name):
            print(name+"       ")
        def __getattribute__(self,name):
            print("    "+name+"    ")
            return super().__getattribute__(name)
        def __setattr__(self,name,value):
            print("   "+name+"  "+value)
            super().__setattr__(name,value)
        def __delattr__(self,name):
            print("   "+name+"   ");
            super().__delattr__(name)
        def fun(self):
            pass
    a = A()
    a.name
    a.name = "  "
    del a.name
    a.fun()
    # output:
    #    id  Pyhon
    #     name    
    # name       
    #    name    
    #    name   
    #     fun    
    
    결 과 를 통 해 알 수 있 듯 이 우리 가 하나의 속성 을 방문 할 때 먼저 호출__getattribute__되 었 고 이 속성 이 존재 하지 않 으 면 다시 호출__getattr__되 었 다.
    이 몇 가지 방법 을 사용 할 때 는 무한 재 귀 에 빠 지지 않도록 주의해 야 한다.연산 자 를 다시 실 을 때 도 이런 실 수 를 하기 쉽다.예 를 들 어 아래 의 오류 등 이다.
    
    class A:
        def __init__(self):
            self.id = "Pyhon"
        def __setattr__(self,name,value):
            print("   "+name+"  "+value)
            if(name == "id"):
                self.id = value
    
    a = A()
    
    이 프로그램 을 실행 할 때 무한 재 귀 에 빠 질 것 입 니 다.이 유 는__setattr__에서 self 대상 에 게 직접 속성 대 가 를 부여 하고 이 는__setattr__방법 을 호출 하기 때 문 입 니 다.
    그래서__setattr__에서 우 리 는 보통 부모 류__setattr__방법 으로 self 대상 의 속성 대 가 를 부여 합 니 다.이것 은 무한 재 귀 에 빠 지지 않 습 니 다.다른 몇 가지 방법 과 연산 자 를 다시 불 러 오 는 것 도 마찬가지 입 니 다.상기 절 차 를 수정 한 후에 다음 과 같 습 니 다.
    
    class A:
        def __init__(self):
            self.id = "Pyhon"
        def __setattr__(self,name,value):
            print("   "+name+"  "+value)
            if(name == "id"):
                super().__setattr__(name,value)
    
    a = A()
    # output
    #    id  Pyhon
    
    5.설명자
  • __get__(self, instance, owner):다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 을 방문 할 때 이 방법 을 호출 하여 이 인 스 턴 스 대상 의 인용 을 되 돌려 줍 니 다.그 중에서 인 스 턴 스 는 이 대상 을 방문 하 는 인 스 턴 스 대상 의 인용 입 니 다.다음 과 같 습 니 다.owner 는 이 대상 을 방문 하 는 클래스 대상
  • 입 니 다.
  • __set__(self, instance, value):다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 에 게 값 을 부여 할 때 이 방법 을 사용 합 니 다.그 중에서 value 는 이 대상 에 게 부여 한 값
  • 입 니 다.
  • __delete__(self, instance):다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 을 삭제 할 때 이 방법 을 사용 합 니 다
  • 
    class Fit:
        def __init__(self):
            self.height = 180
            self.weight = 80
        def __get__(self,instance,owner):
            print("get:",instance,owner)
            return [self.height,self.weight]
        def __set__(self,instance,value):
            print("set:",instance,value)
            self.height = value
            self.weight = value/2
        def __delete__(self,instance):
            del self.height
            del self.weight
            print("delete:",instance)
    
    class Test:
        fit = Fit()
            
    t = Test()
    print (t.fit)
    t.fit = 190
    del t.fit
    # output:
    # get: <__main__.Test object at 0x0000023EFFA738C8> <class '__main__.Test'>
    # [180, 80]
    # set: <__main__.Test object at 0x0000023EFFA738C8> 190
    # delete: <__main__.Test object at 0x0000023EFFA738C8>
    
    일반적인 상황 에서 위의 몇 가지 마법 방법 은 우리 가 하나의 속성 을 정의 하고 이 속성 에 대해 해당 하 는 조작 을 할 수 있 기 를 바 랍 니 다.호출 방법 을 통 해 조작 하 는 것 이 아니 라 우 리 는 이 속성의 유형 을 정의 하여 위의 몇 가지 마법 방법 을 실현 하고 필요 한 속성 을 사례 대상 으로 삼 아 완성 할 수 있 습 니 다.예 를 들 어 위의 Fit 은 사실 체형 류 이 고 Test 에 fit 라 는 체형 속성 이 있 습 니 다.우 리 는 Fit 에서 Fit 의 인 스 턴 스 대상 을 조작 할 때 실행 하 는 동작 을 정의 합 니 다.
    6.맞 춤 형 시퀀스
  • __len__(self):이러한 인 스 턴 스 대상 이 len()에 호출 될 때의 행 위 를 정의 합 니 다
  • __getitem__(self, key):이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 가 져 오 는 행 위 를 정의 합 니 다.즉,self[key]를 실행 할 때의 행동
  • __setitem__(self, key, value):이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 설정 하 는 행 위 를 정의 합 니 다.self[key]=value
  • 에 해당 합 니 다.
  • __delitem__(self, key):이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 삭제 하 는 뉴스 를 정의 합 니 다.del self[key]
  • 에 해당 합 니 다.
    
    class CountList:
        def __init__(self,*args):
            self.values = [x for x in args]#         , args      values   
            self.count = {}.fromkeys(range(len(self.values)),0)
    
        def __len__(self):
            return len(self.values)
    
        def __getitem__(self,key):
            self.count[key] += 1;
            return self.values[key]
    
    c = CountList(1,3,5,7,9,11)
    print(c[1])
    print(c[1]+c[2])
    print(c.count)
    # output:
    # 3
    # 8
    # {0: 0, 1: 2, 2: 1, 3: 0, 4: 0, 5: 0}
    
    이 클래스 의 count 는 대응 하 는 요소 가 방문 한 횟수 를 기록 하 는 것 입 니 다.다른 두 개 도 차이 가 많 지 않 습 니 다.더 이상 예 를 들 지 않 습 니 다.
    교체 기
    교체 기 는 교체 방법 을 제공 하 는 용기 이 고 교체 방법 이란 다음 두 가지__iter____next__이다.
    교체 가능,즉__iter__방법 을 제공 하 는 용기 입 니 다.우리 가 전에 말 한 문자열,목록,모듈,사전,집합 은 모두 교체 가능 하지만 그들 은 교체 기 가 아 닙 니 다.Python 의 내장 함수iter(iterable)를 사용 하여 해당 하 는 교체 기 를 얻 을 수 있 습 니 다.교체 기 사용next(iterator)은 다음 요 소 를 얻 을 수 있 습 니 다.이 두 가지 방법 은 사실 교체 기__iter____next__를 호출 한 것 이다.
  • __iter__(self):교체 기 를 가 져 올 때의 행동 을 정의 합 니 다
  • __next__(self):교체 기 에 대응 하 는 다음 요 소 를 가 져 올 때의 행동 을 정의 합 니 다
  • 
    class Fb:
        def __init__(self,n = 20):
            self.a = 0
            self.b = 1
            self.n = n
        def __iter__(self):
            return self
        def __next__(self):
            t = self.a
            self.a = self.b
            self.b = t + self.b
            if(self.a <= self.n):
                return self.a
            else:
                raise StopIteration
    
    f = Fb()
    for i in f:
        print(i,end=' ')
    # output:1 1 2 3 5 8 13 
    
    그 중에서 raise 는 이상 을 되 돌려 줍 니 다.위의 프로그램 은 아래 와 같 습 니 다.
    
    class Fb:
        def __init__(self,n = 20):
            self.a = 0
            self.b = 1
            self.n = n
        def __iter__(self):
            return self
        def __next__(self):
            t = self.a
            self.a = self.b
            self.b = t + self.b
            if(self.a <= self.n):
                return self.a
            else:
                raise StopIteration
    
    f = Fb()
    it = iter(f)
    while True:
        try:
            i = next(it)
            print(i, end=' ')
        except StopIteration:
            break;
    
    이렇게 하면 우 리 는 Python 에서 for 순환 의 원 리 를 잘 알 수 있 습 니 다.먼저 iter 를 통 해 교체 기 대상 을 얻 은 다음 에 next 를 계속 호출 하여 i 에 게 다음 요소 의 할당 을 가 져 옵 니 다.StopIteration 이상 이 발생 할 때 까지.
    파 이 썬 이 자주 사용 하 는 마법 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 마법 방법 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기