>백엔드 개발 >파이썬 튜토리얼 >Python의 설명자에 대한 자세한 소개

Python의 설명자에 대한 자세한 소개

巴扎黑
巴扎黑원래의
2017-09-16 10:02:151410검색

이 글은 Python의 디스크립터에 대한 지식을 공유할 것입니다. 매우 훌륭하고 참조 가치가 있습니다. 필요한 친구가 참조할 수 있습니다.

Definition

보통 디스크립터는 "바인딩 동작"을 갖는 객체 속성입니다. 바인딩된 동작은 설명자 프로토콜을 통해 사용자 정의 __get__() , __set__() 및 __delete__() 메서드로 재정의될 수 있습니다. 객체의 위 세 가지 메서드 중 하나라도 재정의된 경우 이를 설명자라고 부를 수 있습니다.

속성에 대한 기본 작업은 개체 사전에서 속성을 가져오고 설정하고 삭제하는 것입니다. 예를 들어, 만약 검색 체인의 객체에 설명자 메서드가 정의되어 있으면 Python은 기본 동작을 재정의합니다.

Descriptor는 개발자가 자주 접하지는 않지만 실제로는 클래스, 속성, 함수, 메서드, 정적 메서드, 클래스 메서드 및 super() 뒤에 있는 작동 메커니즘입니다.

설명자 프로토콜

세 가지 메서드 프로토타입은 다음과 같습니다.


descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None

데이터 설명자는 __get__() 및 __set__() 메서드만 있는 개체입니다. 비데이터 설명자. 인스턴스 딕셔너리에 데이터 디스크립터와 동일한 이름의 항목이 있으면 데이터 디스크립터의 우선순위가 더 높습니다. 대조적으로, 비데이터 설명자는 우선순위가 낮습니다.

읽기 전용 데이터 설명자를 생성하려면 __set__() 메서드에서 예외를 발생시키세요.

Call descriptor

descriptor는 메소드 이름을 통해 직접 호출할 수 있습니다. 예를 들어 d.__get__(obj) 입니다.

객체 속성에 액세스하여 설명자를 자동으로 호출하는 것이 더 일반적입니다. 예를 들어, 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) 로 변환됩니다.

설명자 예


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의 설명자에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.