이번 포스팅은 파이썬을 공부하면서 알게 된 디스크립터(Descriptor)에 대해 정리하였습니다.
파이썬은 객체 지향 프로그래밍을 지원하는 언어로
객체의 속성(attribute)를 제어하는 다양한 방법을 제공합니다.
객체의 속성을 제어하는 다양한 방법 중 디스크립터(Descriptor)에 대해 알아보겠습니다.
| 디스크립터(Descriptor) 개념
- Descriptor는 클래스의 속성을 더욱 잘 다룰 수 있게 해주는 파이썬의 클래스 제어 방법 중 하나입니다.
- 객체의 속성(attribute)에서 추가 로직을 적용하거나 속성 값 변환, 유효성 검사 등을 수행할 때 유용하게 사용하며 일반적으로는 'property'나 데코레이터를 사용할 수 있지만 디스크립터는 재사용성이 높은 방법을 제공합니다.
| 디스크립터 메서드
- 디스크립터는 세 가지 메서드를 정의합니다 :
1. __get__(self, instance, owner) : 객체에서 특정 속성 값을 가져오려 할 때 호출
- self는 디스크립터 인스턴스 자체
- instance는 디스크립터가 속한 인스턴스
- owner는 디스크립터가 속한 클래스
- 이 메서드에서 원하는 작업을 수행한 후 값을 반환합니다.
2. __set__(self, instance, value) : 객체에서 특정 속성 값을 설정하려 할 때 호출
- self는 디스크립터 인스턴스 자체
- instance는 디스크립터가 속한 인스턴스
- value는 할당된 값
3. __delete__(self, instance) : 객체에서 특정 속성을 삭제하려 할 때 호출
- self는 디스크립터 인스턴스 자체
- instance는 디스크립터가 속한 인스턴스
- 예시를 통해 디스크럽터의 사용 방법을 알아보겠습니다.
| 디스크립터(Descriptor) 예시
예제 1 ) 온도 값을 다루는 클래스 구현
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
def to_fahrenheit(self):
return self._celsius * 9/5 + 32
def to_celsius(self):
return self._celsius
def set_temperature(self, value):
if value < -273.15:
raise ValueError("Temperature below absolute zero is not possible")
self._celsius = value
temperature = property(to_celsius, set_temperature)
- 위 코드에서 'temperature' 속성을 디스크립터로 정의하였습니다.
이를 통해 속성에 대한 접근과 설정을 제어하고, 온도의 유효성을 검사합니다.
temp = Temperature(25)
# 속성에 직접 접근
print(temp.temperature) # 출력: 25.0
# Descriptors를 통한 접근
temp.temperature = 30
print(temp.temperature) # 출력: 30.0
temp.temperature = -300 # ValueError 발생
- 위 예시에서 디스크립터를 사용하여 온도 값을 보다 안전하게 관리할 수 있습니다.
예제 2 ) 디스크립터를 사용한 길이 변환
class Length:
def __init__(self, meters=0.0):
self.meters = meters
def to_feet(self):
return self.meters * 3.28084
def to_meters(self):
return self.meters
def set_meters(self, value):
if value < 0:
raise ValueError("Length cannot be negative")
self.meters = value
meters = property(to_meters, set_meters)
class Measurement:
length = Length()
def __init__(self, meters):
self.length = meters
# Measurement 객체 생성
measurement = Measurement(5)
# Length 객체 생성
length = measurement.length
# 속성에 값을 할당
length.meters = 10
# 자동으로 피트로 변환된 값 가져오기
feet = length.to_feet()
print(feet) # 출력: 32.8084
- 위 예제에서는 'Length' 클래스를 사용하여 길이 값을 다루고
'Measurement' 클래스에서 디스크럽터를 사용하여 'Length' 객체의 속성을 활용합니다.
'Length' 클래스는 길이를 미터로 다루며 디스크럽터를 통해 자동으로 피트로 변환됩니다.
이를 통해 변경된 피트 값을 가져올 수 있습니다.
| 마치며
- 파이썬 디스크립터(Descriptors)를 사용한 객체 속성 도구를 알게 되었으며 이를 활용하여 프로젝트를 조금 더 객체 지향으로 만들 수 있게 되었습니다. 이를 잘 사용하면 프로그램에서 유지보수성과 가독성을 향상할 수 있을 것이라 기대됩니다.
글에서 틀린 점이 있거나 질문이 있으시면 댓글로 남겨주세요
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'Python > Python 정리' 카테고리의 다른 글
Python 에러 발생 방법 (raise) (0) | 2024.02.15 |
---|---|
Python 예외 처리 방법 (try ~ except) (2) | 2024.02.14 |
[Python] 코루틴(coroutine) 정리 : Python 동시성 및 비동기 작업 (0) | 2023.10.03 |
[Python] 코딩테스트를 위한 리스트(List) 정리 (0) | 2022.08.08 |
[Python] super() 메서드 정리 (0) | 2022.07.06 |