详解Python中的枚举类型

程一诺
程一诺
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python中的枚举类型(Enum),阐述其定义、优势及多种创建方式。通过对比传统字典或类方法与枚举实现的差异,展示枚举在提升代码可读性、维护性及类型安全方面的价值。文章包含从类定义、字典创建到实际应用场景的完整代码示例,帮助开发者更好地利用枚举优化Python项目。

大家好,我是征哥。本文将深入探讨Python中的枚举类型(Enum),解析其存在的必要性以及具体的使用方法。

什么是枚举类型

枚举(Enum)是一种数据类型,它将符号名称绑定到唯一的值。利用枚举,你可以构建用于变量和属性的常量集合。虽然它们的功能类似于全局变量,但枚举提供了更强大的特性,包括分组管理和类型安全机制。Python自3.4版本起,在标准库中正式引入了enum模块。

为什么要使用枚举

在代码中使用枚举主要带来以下优势:

显著提升代码的可读性与可维护性。

有效降低因类型转换错误或拼写失误引发的Bug。

简化后续对常量值的修改与维护工作。

如何使用枚举

以最常用的性别定义为例,我们首先创建一个枚举类型:

>>> from enum import Enum
>>> class Gender(Enum):
...     男 = 1
...     女 = 0
...     未知 = 2
...
>>> Gender
<enum 'Gender'>

访问枚举成员的方式如下:

>>> for g in Gender:
...     print(g.name,g.value)
...
男 1
女 0
未知 2
>>> print(Gender.男.name)
男
>>> print(Gender.男.value)
1
>>> isinstance(Gender.男,Gender)
True
>>> Gender['男']
<Gender.男: 1>
>>> Gender['男'].value
1
>>> Gender['男'].name
'男'
>>> Gender(2).name
'未知'

为了直观展示枚举的优势,我们将对比不使用枚举和使用枚举两种情况下的代码实现。

以汽车销售场景为例,我们需要根据车辆注册所在国家的不同税率来计算最终售价。以下是未使用枚举的实现版本:

from dataclasses import dataclass

@dataclass
class Car:
    model: str
    price: float
    registraion_state: str

    def total_cost(self) -> float:
        match self.registraion_state:
            case "OR":
                return  self.price + (self.price * 0.05)
            case "WA":
                return  self.price + (self.price * 0.10)
            case "CA":
                return  self.price + (self.price * 0.08)
            case _:
                raise TypeError("Invalid registraion_state value")


car1 = Car(model="RAV4", price=30000, registraion_state="OR")
car2 = Car(model="RAV4", price=30000, registraion_state="WA")
car3 = Car(model="RAV4", price=30000, registraion_state="CA")
print(car1.total_cost())
print(car2.total_cost())
print(car3.total_cost())

该代码共26行,在Python 3.10版本下运行结果如下:

31500.0 33000.0 32400.0

接下来,我们展示使用枚举重构后的代码:

from dataclasses import dataclass

from enum import Enum

class StateTax(Enum):
    OR = 0.05
    WA = 0.10
    CA = 0.08

@dataclass
class Car:
    model: str
    price: float
    tax: StateTax

    def total_cost(self) -> float:
        return  self.price + (self.price * self.tax.value)       
    
    def get_tax(self):
        return self.tax.value


car1 = Car(model="RAV4", price=30000, tax=StateTax.OR)
car2 = Car(model="RAV4", price=30000, tax=StateTax.WA)
car3 = Car(model="RAV4", price=30000, tax=StateTax.CA)
print(car1.total_cost())
print(car2.total_cost())
print(car3.total_cost())

重构后代码共28行,运行结果保持一致,但代码结构更加优雅且易于阅读。此外,若需增加新的出口国家地区,只需在枚举中新增成员并创建对应的Car对象即可,无需修改Car类的核心逻辑:

class StateTax(Enum):
    OR = 0.05
    WA = 0.10
    CA = 0.08
    CN = 0.03

car4 = Car(model="RAV4", price=30000, tax=StateTax.CN)

从字典创建枚举

from enum import Enum

tax = {
    'OR': 0.05,
    'WA': 0.10,
    'CA': 0.08,
    'CN': 0.03
}

StateTax = Enum('tax', tax)

访问枚举成员的三种主要方式:

print(StateTax['CN'])
print(StateTax.CN)
print(StateTax(0.03)) #通过 value 来访问

总结

枚举(Enum)是将符号名称绑定到唯一值的数据结构。我们可以通过继承Enum类来定义枚举,并通过enum[member_name]按名称访问成员,或通过enum(member_value)按值访问,亦可通过enum.member_name直接访问属性。使用Enum能显著提升代码的可读性与可维护性,强烈建议在项目中推广使用。

本文关于Python枚举类型的详解到此结束,更多相关Python枚举类型内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表