수색…


간단한 설명자

설명자에는 두 가지 유형이 있습니다. 데이터 기술자는 __get__()__set__() 메서드를 모두 정의하는 객체로 정의되지만 데이터가 아닌 디스크립터는 __get__() 메서드 만 정의합니다. 이 구별은 인스턴스의 사전의 대체 및 네임 스페이스를 고려할 때 중요합니다. 데이터 설명자와 인스턴스 사전의 항목이 같은 이름을 공유하면 데이터 설명자가 우선 적용됩니다. 그러나 대신 비 데이터 디스크립터와 인스턴스 사전의 항목이 같은 이름을 공유하면 인스턴스 사전의 항목이 우선 적용됩니다.

라고 할 때 AttributeError를 제기 세트 ()을 모두 얻을 수 ()와 ()로 설정을 정의, 읽기 전용 데이터 기술자를 확인하십시오. 예외를 발생시키는 자리 표시자를 사용하여 set () 메서드를 정의하면 데이터 설명자가됩니다.

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

구현 된 예 :

class DescPrinter(object):
    """A data descriptor that logs activity."""
    _val = 7
    
    def __get__(self, obj, objtype=None):
        print('Getting ...')
        return self._val

    def __set__(self, obj, val):
        print('Setting', val)
        self._val = val
    
    def __delete__(self, obj):
        print('Deleting ...')
        del self._val


class Foo():
    x = DescPrinter()       

i = Foo()
i.x
# Getting ...
# 7

i.x = 100
# Setting 100
i.x
# Getting ...
# 100

del i.x
# Deleting ...
i.x
# Getting ...
# 7

양방향 전환

디스크립터 객체는 관련 객체 속성이 변경 사항에 자동으로 반응하도록 허용 할 수 있습니다.

주어진 주파수 (Hertz)와주기 (초 단위)로 오실레이터를 모델링한다고 가정 해보자. 빈도를 업데이트하면 기간이 업데이트되고, 기간을 업데이트하면 빈도를 업데이트 할 수 있습니다.

 >>> oscillator = Oscillator(freq=100.0)  # Set frequency to 100.0 Hz
>>> oscillator.period  # Period is 1 / frequency, i.e. 0.01 seconds
0.01
>>> oscillator.period = 0.02  # Set period to 0.02 seconds
>>> oscillator.freq # The frequency is automatically adjusted
50.0
>>> oscillator.freq = 200.0  # Set the frequency to 200.0 Hz
>>> oscillator.period  # The period is automatically adjusted
0.005

우리는 하나의 값 (주파수, 헤르츠 단위)을 "앵커", 즉 변환없이 설정할 수있는 값으로 선택하고 이에 대한 설명자 클래스를 작성합니다.

class Hertz(object):
    def __get__(self, instance, owner):
        return self.value

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

"기타"값 (기간, 초)은 앵커의 관점에서 정의됩니다. 전환을 수행하는 설명자 클래스를 작성합니다.

class Second(object):
    def __get__(self, instance, owner):
        # When reading period, convert from frequency
        return 1 / instance.freq
    
    def __set__(self, instance, value):
        # When setting period, update the frequency
        instance.freq = 1 / float(value)

이제 우리는 Oscillator 클래스를 작성할 수 있습니다.

class Oscillator(object):
    period = Second()  # Set the other value as a class attribute

    def __init__(self, freq):
        self.freq = Hertz()  # Set the anchor value as an instance attribute
        self.freq = freq  # Assign the passed value - self.period will be adjusted


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow