출처 : https://www.pythontutorial.net/python-oop/python-enumeration/
Introduction to the Python Enumeration
정의에 따라 enumeration(열거형)은 고유한 상수 값을 연결한 멤버들의 집합입니다. 열거형은 종종 enum이라고 합니다.
Python은 새 열거형을 정의하기 위한 Enum type을 포함하는 열거형 모듈을 제공합니다 . 또한 Enum 클래스를 서브클래싱하여 새 열거형 type을 정의합니다.
다음 예제에서는 Color라는 열거형을 만드는 방법을 보여 줍니다.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
작동 방식.
1. enum 모듈에서 Enum type을 import합니다.
2. Enum type을 상속하는 Color 클래스를 정의합니다.
3. Color 열거형의 멤버를 정의합니다
열거형의 멤버는 상수입니다. 따라서 그들의 이름은 규칙에 따라 대문자로 표시됩니다.
이 예제에서 Color는 열거형입니다. RED, GREEN, BLUE RED은 Color 열거형의 멤버입니다 . 연결된 값 1, 2 및 3이 있습니다.
멤버의 type은 멤버가 속한 enumeration (열거형)입니다.
다음은 Color.RED의 type이 Color 열거형임을 보여 줍니다.
print(type(Color.RED))
Output:
<enum 'Color'>
Color.RED는 Color 열거형의 인스턴스이기도 합니다.
print(isinstance(Color.RED, Color))
Output:
True
그리고 name과 value 속성이 있습니다.
print(Color.RED.name)
print(Color.RED.value)
Output:
RED
1
Membership and equality
멤버가 열거형에 있는지 확인하려면 in 연산자를 사용합니다 . 예를 들어:
if Color.RED in Color:
print('Yes')
Output:
Yes
두 멤버를 비교하려면 is 또는 == 연산자를 사용할 수 있습니다 . 예를 들어:
if Color.RED is Color.BLUE:
print('red is blue')
else:
print('red is not blue')
Output:
red is not blue
멤버와 멤버와 연결된 값은 같지 않습니다. 다음 예제에서는 False를 반환합니다.
if Color.RED == 1:
print('Color.RED == 1')
else:
print('Color.RED != 1')
Output:
Color.RED != 1
Enumeration members are hashable
열거형 멤버는 항상 hashable. 즉, 열거형 멤버를 사전의 키 또는 Set의 요소로 사용할 수 있습니다.
다음 예제에서는 사전에 Color 열거형의 members를 사용합니다.
rgb = {
Color.RED: '#ff0000',
Color.GREEN: '#00ff00',
Color.BLUE: '#0000ff'
}
Access an enumeration member by name and value
열거형 멤버에 액세스하는 일반적인 방법은 지금까지 살펴본 것처럼 dot notation (.) 구문을 사용하는 것입니다.
Color.RED
Enum은 __getitem__ 메서드를 구현하므로 대괄호 [] 구문을 사용하여 이름으로 멤버를 가져올 수도 있습니다.
예를 들어 다음은 대괄호 [] 구문을 사용하여 Color 열거형의 RED 멤버를 이름으로 가져옵니다.
print(Color['RED'])
Output:
Color.RED
열거형은 callable이므로 해당 값으로 멤버를 가져올 수 있습니다. 예를 들어 다음은 Color 열거형의 RED 멤버를 해당 값으로 반환합니다.
print(Color(1))
Output:
Color.RED
다음 식은 name과 value를 사용하여 동일한 열거형 멤버에 액세스하기 때문에 True를 반환합니다.
print(Color['RED'] == Color(1))
Output:
True
Iterate enumeration members
열거형은 반복 가능하므로 for 루프를 사용하여 반복할 수 있습니다 . 예를 들어:
for color in Color:
print(color)
Output:
Color.RED
Color.GREEN
Color.BLUE
멤버의 순서 는 열거형 정의와 동일합니다.
또한 list() 함수를 사용하여 열거형에서 멤버 list를 반환 할 수 있습니다.
print(list(Color))
Output:
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
Enumerations are immutable
열거형은 immutable(변경불가)이다. 즉, 열거형이 정의된 후에는 멤버를 추가하거나 제거할 수 없습니다 . 또한 멤버 값을 변경할 수 없습니다.
다음 예제에서는 Color 열거형에 새 멤버를 할당하려고 시도하고 TypeError가 발생합니다.
Color['YELLOW'] = 4
Error:
TypeError: 'EnumMeta' object does not support item assignment
다음 예제에서는 Color 열거형의 RED 멤버 값을 변경하려고 시도하고 AttributeError가 발생합니다.
Color.RED.value = 100
Output:
AttributeError: can't set attribute
Inherits from an enumeration
열거형은 super class에 멤버가 있다면 상속될 수 없습니다. 다음 예제는 Color 열거형에 멤버가 없기 때문에 제대로 작동합니다.
class Color(Enum):
pass
class RGB(Color):
RED = 1
GREEN = 2
BLUE = 3
그러나 다음 예제는 RGB 열거형에 멤버가 있으므로 작동하지 않습니다.
class RGBA(RGB):
ALPHA = 4
Error:
TypeError: Cannot extend enumerations
Python enumeration example
다음 예제에서는 ResponseStatus라는 열거형을 정의합니다.
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
HTTP 요청에서 다음 문자열의 응답을 받았다고 가정합니다.
response = '''{
"status":"fulfilled"
}'''
그리고 status별로 ResponseStatus열거형을 조회하려고 합니다. 이렇게 하려면 응답의 문자열을 사전으로 변환하고 상태 값을 가져와야 합니다.
import json
data = json.loads(response)
status = data['status']
그런 다음 상태 값으로 ResponseStatus 열거형의 멤버를 조회합니다.
print(ResponseStatus(status))
Output:
PromiseStatus.FULFILLED
전체 프로그램은 다음과 같습니다.
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"fulfilled"
}'''
data = json.loads(response)
status = data['status']
print(ResponseStatus(status)) # ResponseStatus.FULFILLED
status가 ResponseStatus 멤버의 값 중 하나가 아닌 경우 어떻게 해야 합니까? 그러면 오류가 발생합니다. 예를 들어:
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"ok"
}'''
data = json.loads(response)
status = data['status']
print(ResponseStatus(status))
Error:
ValueError: 'ok' is not a valid ResponseStatus
예외를 catch하려면 다음 처럼 try...except문을 사용할 수 있습니다
from enum import Enum
import json
class ResponseStatus(Enum):
PENDING = 'pending'
FULFILLED = 'fulfilled'
REJECTED = 'rejected'
response = '''{
"status":"ok"
}'''
data = json.loads(response)
status = data['status']
try:
if ResponseStatus(status) is ResponseStatus.FULFILLED:
print('The request completed successfully')
except ValueError as error:
print(error)
Summary
- 열거형은 고유한 상수 값을 연결한 멤버 집합입니다.
- enum 모듈의 Enum type을 상속하여 새 열거형 class를 만듭니다.
- 멤버는 자신이 속한 열거형과 동일한 type이다. -> enum
- enumeration['member_name']을 사용하여 name속성으로 멤버에 액세스하고 enumeration(member_value)을 사용하여 value속성으로 멤버에 액세스합니다.
- 열거형은 iterable(반복 가능)이다.
- 열거형 멤버는 hashable(해시가능)이다.
- 열거형은 immutable(변경불가)이다.
- 열거형은 super class에 멤버가 있다면 상속될 수 없습니다.
'Python Object-oriented Programming' 카테고리의 다른 글
Customize and Extend Python Enum Class (0) | 2023.04.04 |
---|---|
num aliases & @enum.unique Decorator (0) | 2023.04.04 |
__slots__ Method (0) | 2023.04.04 |
overriding-method (0) | 2023.04.04 |
inheritance (0) | 2023.04.04 |
댓글