본문 바로가기
Python Object-oriented Programming

enumeration

by 자동매매 2023. 4. 4.

출처  : 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

댓글