>  기사  >  백엔드 개발  >  Python에서 설명자 설명자를 사용하는 방법에 대한 간결한 가이드에 대한 자세한 설명

Python에서 설명자 설명자를 사용하는 방법에 대한 간결한 가이드에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-03 15:53:381379검색

설명자는 주로 Python에서 메서드와 속성을 정의하는 데 사용되며 그 사용은 상당히 기술적입니다. 여기서는 기본부터 시작하여 Python에서 설명자 설명자를 사용하기 위한 간결한 가이드를 컴파일합니다.

iterator의 경우 설명은 반복 프로토콜을 구현하는 객체, 즉 __iter__ 메서드를 구현하는 객체입니다. 마찬가지로 소위 디스크립터는 디스크립터 프로토콜, 즉 __get__, __set__ 및 __delete__ 메소드를 구현하는 객체입니다.

정의만 보면 꽤 추상적인데요. 얘기가 싸다. 코드를 살펴보세요.

class WebFramework(object):
  def __init__(self, name='Flask'):
    self.name = name

  def __get__(self, instance, owner):
    return self.name

  def __set__(self, instance, value):
    self.name = value


class PythonSite(object):

  webframework = WebFramework()

In [1]: PythonSite.webframework
Out[1]: 'Flask'

In [2]: PythonSite.webframework = 'Tornado'

In [3]: PythonSite.webframework
Out[3]: 'Tornado'

는 설명자 프로토콜 __get__ 및 __set__을 구현하는 클래스 WebFramework를 정의합니다. 객체(클래스도 객체이고 모든 것이 객체입니다. )가 설명자가 됩니다. __get__과 __set__을 모두 구현하는 것을 데이터 설명자라고 합니다. __get__만 구현하는 것들은 설명자가 아닙니다. 둘 사이의 차이점은 인스턴스에 상대적인 사전의 우선순위입니다.

인스턴스 사전에 디스크립터와 동일한 이름의 속성이 있는 경우, 디스크립터가 데이터 디스크립터이면 데이터 디스크립터가 아닌 경우 해당 속성을 먼저 사용합니다. 사전에 있는 것이 먼저 사용됩니다.

설명자 호출
이러한 유형의 마술에서는 호출 방법을 직접 사용하지 않는 경우가 많습니다. 예를 들어 데코레이터는 @ 기호를 사용하여 호출해야 합니다. 반복자는 일반적으로 반복 중에 또는 다음 메서드 호출을 사용하는 동안 사용됩니다. 설명자는 비교적 간단하며 객체 속성이 설정될 때 호출됩니다.

In [15]: webframework = WebFramework()

In [16]: webframework.__get__(webframework, WebFramework)
Out[16]: 'Flask'

descriptor의 적용
descriptor의 역할은 주로 메소드와 속성의 정의에 있습니다. 클래스의 속성을 다시 설명할 수 있으므로 이 마법은 클래스의 일부 동작을 변경할 수 있습니다. 가장 간단한 응용 프로그램은 데코레이터를 사용하여 클래스 속성의 캐시를 작성하는 것입니다. Flask의 작성자는 설명자의 특성을 사용하여 캐시를 구현하는 werkzeug 네트워크 도구 라이브러리를 작성했습니다.

class _Missing(object):
  def __repr__(self):
    return 'no value'

  def __reduce__(self):
    return '_missing'


_missing = _Missing()


class cached_property(object):
  def __init__(self, func, name=None, doc=None):
    self.__name__ = name or func.__name__
    self.__module__ = func.__module__
    self.__doc__ = doc or func.__doc__
    self.func = func

  def __get__(self, obj, type=None):
    if obj is None:
      return self
    value = obj.__dict__.get(self.__name__, _missing)
    if value is _missing:
      value = self.func(obj)
      obj.__dict__[self.__name__] = value
    return value


class Foo(object):
  @cached_property
  def foo(self):
    print 'first calculate'
    result = 'this is result'
    return result


f = Foo()

print f.foo  # first calculate this is result
print f.foo  # this is result

첫 번째 계산은 처음 호출될 때만 계산되고 결과가 캐시됩니다. 이것의 장점은 네트워크 프로그래밍에서 HTTP 프로토콜을 파싱할 때 일반적으로 HTTP 헤더를 파이썬의 사전으로 파싱하는데, 뷰 기능을 사용할 때 이 헤더를 한번에 접근할 수 있기 때문에 이 헤더를 캐싱은 중복된 구문 분석을 줄일 수 있습니다.

설명자는 Python에서 널리 사용되며 일반적으로 데코레이터와 함께 사용됩니다. 위대한 마법에는 큰 책임이 따른다. 설명자는 ORM에서 SQL 문의 "사전 컴파일"을 구현하는 데 사용될 수도 있습니다. 설명자를 적절하게 사용하면 Python 코드를 더욱 우아하게 만들 수 있습니다.

Python의 설명자 설명자 간략한 사용법에 대한 자세한 설명은 PHP 중국어 웹사이트의 관련 기사를 주목해주세요!

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