>  기사  >  백엔드 개발  >  Python의 열거형

Python의 열거형

高洛峰
高洛峰원래의
2016-11-22 17:13:541424검색

열거형은 레이블 또는 상수 컬렉션으로 간주할 수 있으며 일반적으로 요일, 월, 상태 등과 같은 특정하고 제한된 컬렉션을 나타내는 데 사용됩니다. Python의 기본 유형(내장 유형)에는 특별한 열거 유형이 없지만 사전, 클래스 등 다양한 방법을 통해 구현할 수 있습니다.

WEEKDAY = {
    'MON': 1,
    'TUS': 2,
    'WEN': 3,
    'THU': 4,
    'FRI': 5
}
class Color:
    RED   = 0
    GREEN = 1
    BLUE  = 2

위 두 가지를 볼 수 있습니다. 이러한 열거형 변수가 로컬 범위에서만 사용되는 경우에는 문제가 없지만 모두 변경 가능하므로 다른 곳에서 수정될 수 있다는 문제가 있습니다. 사용:

WEEKDAY['MON'] = WEEKDAY['FRI']print(WEEKDAY)
{'FRI': 5, 'TUS':
{'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4}

클래스에 의해 정의된 열거형은 인스턴스화될 수도 있고 설명이 아닌 상태가 될 수도 있습니다.

c = Color()
print(c.RED)
Color.RED = 2
print(c.RED)
0
2

물론 변수 유형도 사용할 수 있습니다. (불변), 예를 들어 열거형 유형의 원래 의미를 잃고 레이블을 의미 없는 변수로 저하시킵니다.

COLOR = ('R', 'G', 'B')
print(COLOR[0], COLOR[1], COLOR[2])
R G B

더 나은 솔루션을 제공하기 위해 Python은 열거형 표준 라이브러리를 추가했습니다. 버전 3.4부터 PEP 435까지. 3.4 이전 버전에서는 pip install enum을 통해 호환되고 지원되는 라이브러리를 다운로드할 수도 있습니다. enum은 Enum/IntEnum/unique라는 세 가지 도구를 제공하며 사용법은 매우 간단합니다. Enum/IntEnum을 상속하여 열거형 유형을 정의할 수 있습니다. 여기서 IntEnum은 열거형 멤버를 정수 유형으로 제한하거나 고유 유형으로 변환할 수 있습니다. 데코레이터는 열거형 멤버의 값을 반복 불가능하도록 제한합니다.

from enum import Enum, IntEnum, uniquetry:    @unique
    class WEEKDAY(Enum):
        MON = 1
        TUS = 2
        WEN = 3
        THU = 4
        FRI = 1except ValueError as e:
    print(e)
duplicate values found in <enum &#39;WEEKDAY&#39;>: FRI -> MON
try:    class Color(IntEnum):
        RED   = 0
        GREEN = 1
        BLUE  = &#39;b&#39;except ValueError as e:
    print(e)
invalid literal for int() with base 10: &#39;b&#39;

더 흥미로운 점은 Enum의 멤버가 모두 변경:

class Color(Enum):
    R = 0
    G = 1
    B = 2
try:
    Color.R = 2except AttributeError as e:
    print(e)
Cannot reassign members.

인스턴스화할 수는 없지만 열거형 멤버를 변수에 할당할 수 있습니다:

red = Color(0)
green = Color(1)
blue = Color(2)
print(red, green, blue)
Color.R Color.G Color.B

비교 판단도 할 수 있습니다:

print(red is Color.R)
print(red == Color.R)
print(red is blue)
print(green != Color.B)
print(red == 0) # 不等于任何非本枚举类的值
True
True
False
True
False

마지막으로 열거형 멤버 자체도 열거형이므로 다른 멤버도 열거형 멤버를 통해 찾을 수 있습니다.

print(red.B)
print(red.B.G.R)
Color.B
Color.R

그러나 이 기능은 멤버의 원래 네임스페이스 이름과 충돌할 수 있으므로 주의해서 사용해야 합니다.

print(red.name, &#39;:&#39;, red.value)

class Attr(Enum):
    name  = &#39;NAME&#39;
    value = &#39;VALUE&#39;
print(Attr.name.value, Attr.value.name)
R : 0
NAME value

요약

사용법 enum 모듈의 구조는 매우 간단하고 그 기능도 매우 간단하지만 구현 방법은 배울 가치가 있습니다. Python의 클래스 및 메타클래스의 마법에 대해 더 배우고 싶지만 시작하는 방법을 모른다면 enum의 소스 코드를 읽거나 다음 몇 가지 기사의 내용에 주의를 기울이는 것이 좋습니다. !


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.