✨ 前言:
🌟 什么是枚举?
枚举(Enumeration)是一种数据类型,其中每个枚举值都是一个实例,都代表该数据类型的一个可能的值。在很多编程语言中,比如C、Java、C#和Python等,枚举都得到了支持,枚举成员常常用于代替一组硬编码的常量。枚举是一种编程模式,用于定义一组有限、固定且通常不可变的值 的集合。这些值称为枚举的成员(或元素)。枚举的每个成员都有一个名称和一个相关联的数值(可以是整数、字符串或任何其它字面量)。
🌟为什么需要枚举?
可读性:在代码中使用明确命名的枚举值而不是字面常量,可以提高可读性,让代码的意图更清晰。
维护性:枚举集中管理一系列相关的常量,方便修改和维护。
类型安全:相比于使用一组无关联的字面量(如整数或字符串),枚举作为一种自定义类型,能提供编译时的类型安全检查。
逻辑分组:枚举提供了一种逻辑上将相关常量分组的方式,如颜色、方向、状态等。
防止非法值:枚举值必须是预先定义的成员之一,这防止了非法值的赋值和使用。
🌟枚举的特点
唯一性:枚举保证每个成员的值都是唯一的。
不可变性:枚举成员一旦被创建,就不可以被修改。
独立类型:枚举提供的成员都属于定义它们的枚举类型。
迭代性:枚举可以被迭代,枚举成员可以按照定义的顺序遍历。
可比较性:枚举成员可以比较相等性和身份,但除非显式定义,通常不支持大小比较。
可访问性:每个枚举成员都可以通过其名称或值来访问。
🌟在python中引入枚举的作用
在 Python 中引入枚举(Enums)主要是为了提供一种表达一组命名常量的清晰、高效且可靠的方式。枚举的使用有多种好处和作用,主要包括但不限于以下几点:
- 增强代码可读性
使用枚举,可以通过命名标识符(而非原始值,如数字或字符串)来引用常量,使代码更加直观易读。例如,在处理HTTP状态码时,StatusCode.OK 比简单的数字 200 更清晰表达了程序的意图。 - 减少错误
由于枚举的值是固定且不可变的,它们在编译时就已经确定,这减少了因拼写错误或不恰当的值赋值导致的错误。 - 便于维护
通过将一组相关的常量组合在一起,枚举使得对这些常量的维护变得更集中和方便。 - 类型安全
枚举提供了一种类型安全的方式来使用这组常量。这意味着如果一个函数期望一个枚举类型的参数,那么传入非该枚举类型的值将在编码阶段或运行阶段(取决于语言和环境)被识别为错误。 - 易于遍历
在 Python 中,枚举可以很方便地被遍历,使得对枚举成员的处理更加灵活。这对于需要检查或展示所有可能选项的情况非常有用。 - 支持自定义行为
Python 的枚举还允许在枚举类中定义方法,使得枚举不仅仅是简单的常量集合,还可以包括一些特定于这个枚举类的行为。
✨一、python中的枚举库Enum使用
🌟1.1 创建枚举类
使用枚举之前,首先需要导入enum模块或从中导入Enum基类。
通过继承Enum类,可以创建自己的枚举类。枚举的成员在类中定义且为唯一的。
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
🌟1.2使用枚举成员
一旦定义了枚举类,我们就可以通过枚举名称或者枚举值来访问枚举成员。
# 通过名称访问
print(Color.RED) # Color.RED
print(Color.RED.name) # RED
print(Color.RED.value) # 1
# 通过值访问
print(Color(1)) # Color.RED
🌟1.3枚举迭代和比较
枚举成员都是可迭代的,并且每个成员都是唯一的。它们也支持比较操作。
for color in Color:
print(color)
# 比较操作
print(Color.RED == Color.BLUE) # False
🌟1.4自动值
枚举还支持自动值的生成,利用auto()函数可以自动分配枚举值。
from enum import Enum, auto
"""
Enum.auto() 自动生成枚举值
"""
class Color(Enum):
RED = auto()
GREEN = auto()
BLUE = auto()
print(Color.RED.value) # 1
print(Color.GREEN.value) # 2
print(Color.BLUE.value) # 3
⚠️ 使用auto()后,枚举值将从1开始自动分配。
🌟1.5 枚举的高级用法
枚举还支持一些高级功能如自定义方法和自定义值检查等。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
@staticmethod
def is_primary_color(value):
return value in (Color.RED, Color.GREEN)
print(Color.is_primary_color(Color.RED)) # True
print(Color.is_primary_color(Color.BLUE)) # False
🌟1.6 别名 (Alias for Enum Values)
枚举还可以支持别名,当两个成员被赋予相同的值时,第二个成员将会成为第一个成员的别名:
from enum import Enum
class Status(Enum):
ACTIVE = 1
RUNNING = 1 # RUNNING将成为ACTIVE的别名
print(Status.RUNNING == Status.ACTIVE) # True
print(Status.RUNNING is Status.ACTIVE) # True
⚠️要注意使用is关键字比较时,别名是相同的实例。
🌟1.7动态创建enum (Dynamic Enum Creation)
我们可以动态地创建枚举,使用Enum类本身作为函数:
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
print(Animal.ANT) # Animal.ANT
print(Animal.BEE.value) # 2
这里我们创建了一个名为Animal的枚举,它具有四个成员:ANT BEE CAT DOG
🌟1.8Ensuring Enum Uniquence (确保枚举成员的唯一性)
有时候我们想确保所有的枚丽数值是唯一的,可以使用@unique装饰器来确保成员的唯一性:
from enum import Enum, unique
@unique
class UniqueColor(Enum):
RED = 1
GREEN = 2
BLUE = 3
PURPLE = 1 # 如果去掉注释会抛出ValueError,因为1已经被RED使用
print(UniqueColor.RED) # ValueError: duplicate values found in <enum 'UniqueColor'>: PURPLE -> RED
🌟1.9自定义枚举类 (Customized Enum)
我们可以在枚举类中定义方法和新属性:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
def describe(self):
return f"{self.name} is my favorite color."
@property
def primary(self):
return self in (Color.RED, Color.GREEN)
print(Color.RED.describe()) # RED is my favorite color.
print(Color.BLUE.primary) # False
🌟1.10实例:
例如,定义了一个用于表示HTTP状态码的枚举:
from enum import Enum
class StatusCode(Enum):
OK = 200
NOT_FOUND = 404
INTERNAL_SERVER_ERROR = 500
# 使用枚举元素
status = StatusCode.OK
# 检查状态码是否是 OK
if status == StatusCode.OK:
print("请求成功!")
# 枚举类型检查
if isinstance(status, StatusCode):
print("这是一个有效的状态码。")
在这个例子中,StatusCode 枚举通过为 HTTP 状态码提供描述性名称,增强了代码的可读性并减少使用魔术数字的情况。
✨小结:
枚举提供了一种类型安全的方式来处理一组固定的值,这些值彼此相关且不会改变。在现实生活中,枚举的概念类似于在特定类别中选择固定选项的任何情形。引入枚举的使用,在编程中提供了一种更加结构化和安全的方式来处理一组相关但固定的值。这对于加强代码的健壮性、可维护性及可读性都有重要作用。