枚举(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 行,用 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 成员,也可以通过并通过 enum(member_value) 访问,还可以通过 enum.member_name 来访问。Enum 可以帮助我们使代码更具可读性,更具可维护性,枚举类型一旦定义,不可修改,更安全,推荐大家都用一用。如果有收获,不妨持续关注编程学习网,与你一起学 Python。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9880/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取