반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 판교
- socketio
- Torch
- no space left on device
- Android
- TTS
- CLASS
- ROS2
- 터미널
- CUDA
- 맛집
- error
- ubuntu
- 티스토리챌린지
- linux
- string
- opencv
- openAI
- ChatGPT
- tensorflow
- timm
- python
- 스팸
- 딥러닝
- pytorch
- ros
- 오블완
- humble
- GPT
- 분당맛집
Archives
- Today
- Total
RoBoLoG
[Python] 디스크립터 (descriptor) 본문
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__ 메서드는 어트리뷰트에 접근할 때 해당 값을 반환합니다. MyClass의 number 어트리뷰트는 이 디스크립터의 인스턴스입니다. 따라서 instance.number에 값을 할당하거나 접근할 때 디스크립터의 __set__ 또는 __get__ 메서드가 호출됩니다.
728x90
반응형
'Study > Python' 카테고리의 다른 글
[Python] 파이썬에서 List 사용 예시 (0) | 2024.01.17 |
---|---|
[Python] 파이썬의 메타클래스(MetaClass) (0) | 2024.01.10 |
[Python] Wrapper란 무엇인가? (0) | 2024.01.09 |
[Python] 클래스 만들 때 super().__init__() 사용하는 이유? + 부모 클래스가 2개 이상인 경우 (2) | 2024.01.08 |
[Python] 클래스와 서브클래스 (2) | 2024.01.05 |