스택큐힙리스트

__get__와 __set__ 그리고 Python 디스크립터 이해하기 본문

카테고리 없음

__get__와 __set__ 그리고 Python 디스크립터 이해하기

스택큐힙리스트 2023. 4. 16. 13:48
반응형

저는 Python의 디스크립터가 무엇인지 이해하려 노력하고 있습니다. 그들이 어떻게 작동하는지는 이해했지만, 여전히 의문이 있습니다. 다음 코드를 고려해보세요.

class Celsius(object):

def __init__(self, value=0.0):

self.value = float(value)

def __get__(self, instance, owner):

return self.value

def __set__(self, instance, value):

self.value = float(value)

class Temperature(object):

celsius = Celsius()

나는 왜 디스크립터 클래스가 필요한가요?

여기서 instance와 owner은 무엇인가요? (__get__에서) 이러한 매개 변수의 목적은 무엇인가요?

이 예시를 어떻게 부르고/사용할까요?

답변 1

디스크립터는 Python의 property 타입을 구현하는 방법입니다. 디스크립터는 단순히 __get__ , __set__ 등을 구현하고, 그것이 다른 클래스에 정의될 때 추가됩니다 (위에서 Temperature 클래스처럼). 예를 들어:

temp=Temperature()

temp.celsius #calls celsius.__get__

위의 예에서 서술자를 할당한 속성 (celsius)에 액세스하면 적절한 서술자 메서드가 호출됩니다.

instance은 __get__에서 클래스 인스턴스입니다 (따라서 위에서, __get__는 temp를 받게 됩니다. owner는 디스크립터를 갖는 클래스입니다 (따라서 이 경우에는 Temperature가 됩니다).

그것을 구동시키는 논리를 캡슐화하기 위해 기술자 클래스를 사용해야합니다. 예를 들어 기술자가 비용이 많이 드는 작업을 캐시하는 데 사용되는 경우, 클래스가 아닌 자체에 값을 저장할 수 있습니다.

공식 Python 문서에는 여러 예시를 포함하여 더 자세한 설명을 제공하는 article about descriptors 가 포함되어 있습니다.

편집: jchl씨가 댓글에서 지적하신 것처럼, 단순히 Temperature.celsius 를 입력하면 instance 로 나타납니다.

답변 2

파이썬에서는 __get__과 __set__ 및 디스크립터라는 개념이 있습니다. 이들은 객체의 속성을 다루는 데 사용되며, 파이썬 인터프리터에게 속성이 어떻게 액세스되는지 명시합니다.

__get__은 객체의 속성을 가져오기 위한 메서드입니다. 이를 정의하여 객체의 속성을 읽을 때 어떤 일이 일어나는지를 변경할 수 있습니다. 예를 들어, 속성이 정의되지 않은 경우 디폴트 값을 반환하도록 지정할 수 있습니다.

반면, __set__은 객체의 속성을 설정하기 위한 메서드입니다. 이를 정의하여 객체의 속성이 설정될 때 어떤 일이 일어나는지를 변경할 수 있습니다. 또한, 사용자가 속성 값을 변경하는 시점에서 몇 가지 강제 규칙을 적용할 수도 있습니다.

둘 다 디스크립터는 단순한 표준 튜플이 아닌 더 많은 기능이 추가된 파이썬 내장 객체입니다. 디스크립터는 클래스 데코레이터 또는 클래스 속성으로 정의됩니다. 클래스 속성으로 정의된 디스크립터는 일반적으로 속성 액세스에 대한 메서드를 제공하고, 클래스 데코레이터로 정의된 디스크립터는 특정 인스턴스 변수에 대한 액세스 메서드를 제공합니다.

이러한 메서드를 사용하여 객체의 속성에 대한 액세스 방식을 변경하거나 추가 기능을 구현할 수 있습니다. 예를 들어, 객체의 속성 값을 실제로 파일에서 나누어 읽어오는 경우, 디스크립터를 사용하여 속성을 읽을 때 파일에서 값을 곧바로 읽어오게 할 수 있습니다.

Python Descriptors는 선언적 프로그래밍의 개념을 적용하는 좋은 방법이며, 객체의 속성을 보호하고 일관성 있는 방식으로 액세스하도록 보장할 수 있습니다. 이러한 메서드를 사용하여 객체지향 제작에서 보안과 일관성을 유지함으로써 진정한 모듈러리티를 달성할 수 있습니다.

반응형
Comments