Python 의 descriptor 를 쉽게 이해 합 니 다.

2526 단어 pythondescriptor
정의.
일반적으로 하나의 descriptor 는'귀속 행위'의 대상 속성 을 가지 고 있다.바 인 딩 행 위 는 descriptor 프로 토 콜 을 통 해 사용자 정의get__() , __set__() 와delete__() 방법 을 다시 쓰다.한 대상 의 상기 세 가지 방법 중 하 나 를 다시 쓰 면 descriptor 라 고 할 수 있다.
속성의 기본 동작 은 대상 사전 에서 속성 을 가 져 오고 설정 하 며 삭제 하 는 것 입 니 다.예 를 들 어 a.x 에 검색 체인 이 있 는데 먼저 a.dict__['x'],없 으 면 type(a).dict__['x'],원류 까지 부 류 를 위로 찾 지 않 았 다 면.체인 을 찾 을 때 대상 이 descriptor 방법 으로 정의 되면 Python 은 기본 행동 을 덮어 씁 니 다.
Descriptor 는 강력 한 도구 입 니 다.개발 자 들 이 자주 접 하지 않 지만 클래스,속성,함수,방법,정적 방법,클래스 방법 과 슈퍼()뒤의 운영 체제 입 니 다.
설명 프로 토 콜
세 가지 방법의 원형 은 다음 과 같다.

descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None
데이터 descriptor 는 동시에get__() 와set__() 방법의 대상, 만 있다 면get__() 방법 은 비 데이터 descriptor 입 니 다.인 스 턴 스 사전 에 데이터 descriptor 와 같은 이름 의 입구 가 있다 면 데이터 descriptor 우선 순위 가 더 높 습 니 다.반면 비 데이터 descriptor 우선 순위 가 낮 습 니 다.
장set__() 방법 은 이상 을 던 지면 읽 기 전용 데이터 descriptor 를 만 들 수 있 습 니 다.
호출 기술자
descriptor 는 방법 명 을 통 해 직접 호출 할 수 있 습 니 다.예 를 들 어 d.get__(obj) 。
방문 대상 속성 을 통 해 descriptor 를 자동 으로 호출 하 는 것 이 더 일반적인 방법 입 니 다.예 를 들 어 d 가 방법 을 정의 하면get__() ,obj.d 가 d. 를 호출 합 니 다.get__(obj) 。
대상 에 대해 b.x 는 type(b). 로 변 환 됩 니 다.dict__['x'].__get__(b, type(b)) 。그리고 클래스(네,클래스 도 호출 할 수 있 습 니 다)에 대해 B.x 는 B. 로 전 환 됩 니 다.dict__['x'].__get__(None, B) 。
Descriptor 예

class RevealAccess(object):
  """A data descriptor that sets and returns values
    normally and prints a message logging their access.
  """
  def __init__(self, initval=None, name='var'):
    self.val = initval
    self.name = name
  def __get__(self, obj, objtype):
    print('Retrieving', self.name)
    return self.val
  def __set__(self, obj, val):
    print('Updating', self.name)
    self.val = val
>>> class MyClass(object):
...   x = RevealAccess(10, 'var "x"')
...   y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
총결산
위 에서 말 한 것 은 소 편 이 소개 해 준 Python 의 descriptor 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기