Skip to main content

Python 面向对象

Python 枚举类

枚举类(Enum)是 Python 中用于定义一组固定常量的数据类型,适合表示有限的、离散的值集合。Python 的 enum 模块提供了创建枚举类的支持,增强了代码的可读性和类型安全性。

定义枚举类

使用 enum 模块的 Enum 类来定义枚举。每个枚举成员是一个常量,通常使用大写字母命名。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

每个成员(如 Color.RED)具有名称(name)和值(value)。

  • Color.RED.name 返回 'RED'
  • Color.RED.value 返回 1

使用枚举类

访问枚举成员

可以通过点号访问枚举成员,或者通过值或名称查找。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

# 访问成员
print(Color.RED)        # 输出: Color.RED
print(Color.RED.value)  # 输出: 1
print(Color['RED'])     # 输出: Color.RED
print(Color(1))         # 输出: Color.RED

迭代和比较

枚举类支持迭代和比较操作。比较时,枚举成员只与同一枚举类的成员比较。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

# 迭代
for color in Color:
    print(color)  # 输出: Color.RED, Color.GREEN, Color.BLUE

# 比较
print(Color.RED == Color.RED)    # 输出: True
print(Color.RED == Color.GREEN)  # 输出: False

实际应用

枚举常用于定义状态、选项等。例如,定义一周的日子:

from enum import Enum

class Weekday(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7

def is_weekend(day):
    return day in (Weekday.SATURDAY, Weekday.SUNDAY)

print(is_weekend(Weekday.SATURDAY))  # 输出: True
print(is_weekend(Weekday.MONDAY))    # 输出: False

枚举的优点

  1. 可读性强:枚举成员的名称比硬编码的数字或字符串更直观。
  2. 类型安全:枚举成员是唯一的,防止意外赋值或比较错误。
  3. 约束值:限制变量只能取预定义的值,减少错误。
  4. 易于维护:集中管理常量,修改时只需更新枚举定义。

注意事项

避免冲突:同一枚举类中,成员值和名称必须唯一,否则会报错。

使用 IntEnum:如果需要枚举值参与数值运算,使用 IntEnum

from enum import IntEnum

class Priority(IntEnum):
    LOW = 1
    MEDIUM = 2
    HIGH = 3

print(Priority.LOW < Priority.HIGH)  # 输出: True

值类型:值可以是任意类型(如字符串、元组),但需确保唯一性。

from enum import Enum

class Status(Enum):
    SUCCESS = "ok"
    ERROR = "fail"

print(Status.SUCCESS.value)  # 输出: ok

不可变性:枚举成员不可修改其值或名称。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

# 以下会报错
# Color.RED = 4  # AttributeError