RoBoLoG

[Python] 디스크립터 (descriptor) 본문

Study/Python

[Python] 디스크립터 (descriptor)

SKJun 2024. 1. 9. 12:00

Python에서 디스크립터란 무엇인가?

파이썬에서 디스크립터(descriptor)는 객체의 어트리뷰트에 대한 접근을 커스텀 제어하는 메커니즘을 제공합니다. 디스크립터는, 간단히 말해, __get__, __set__, 또는 __delete__ 메서드를 구현한 클래스입니다. 이 메서드들은 어트리뷰트에 접근, 할당, 삭제할 때 호출됩니다.

 

디스크립터를 사용하는 주된 이유는 코드 재사용과 데이터 관리를 캡슐화하기 위해서입니다. 예를 들어, 특정 타입의 데이터를 갖는 어트리뷰트나 값의 범위를 검증하는 로직을 중복 없이 여러 클래스에 적용할 수 있습니다.

 


예시

예를 들어, 어떤 클래스의 특정 어트리뷰트가 항상 양수여야 한다고 가정해 보겠습니다. 이를 위해 디스크립터 클래스를 생성하여 __set__ 메서드에서 검증 로직을 구현할 수 있습니다.

 

# 디스크립터 클래스 정의
class PositiveNumber:
    def __init__(self):
        self.value = 0  # 초기 값 설정

    def __get__(self, obj, objtype=None):
        return self.value  # 어트리뷰트에 접근할 때 반환할 값

    def __set__(self, obj, value):
        if value < 0:
            raise ValueError("Value must be positive")  # 값이 양수가 아닌 경우 예외 발생
        self.value = value  # 값 설정

    def __delete__(self, obj):
        print("Attribute deletion is not allowed.")  # 어트리뷰트 삭제 시 메시지 출력

# 디스크립터를 사용하는 클래스 정의
class MyClass:
    number = PositiveNumber()  # 디스크립터 인스턴스를 클래스 어트리뷰트로 할당

# MyClass 인스턴스 생성
instance = MyClass()

# 어트리뷰트에 값 할당
instance.number = 5  # 양수이므로 정상 작동
print(instance.number)  # 5 출력

# 예외 처리
try:
    instance.number = -10  # 음수를 할당하려고 하면 ValueError 발생
except ValueError as e:
    print(e)  # "Value must be positive" 메시지 출력

# 어트리뷰트 삭제 시도
try:
    del instance.number  # __delete__ 호출
except AttributeError as e:
    print(e)  # 예외 메시지 출력

 

이 코드에서 PositiveNumber 클래스는 디스크립터로서 동작합니다. __set__ 메서드는 어트리뷰트에 값이 할당될 때 호출되어 값이 양수인지 확인하고, 그렇지 않은 경우 ValueError를 발생시킵니다. __get__ 메서드는 어트리뷰트에 접근할 때 해당 값을 반환합니다. MyClassnumber 어트리뷰트는 이 디스크립터의 인스턴스입니다. 따라서 instance.number에 값을 할당하거나 접근할 때 디스크립터의 __set__ 또는 __get__ 메서드가 호출됩니다.

728x90
반응형