详解Python中的枚举类型

2022-08-10 10:13:18

目录什么是枚举类型为什么要使用枚举如何使用枚举从字典创建枚举最后的话你好,我是征哥,今天分享一下Python中的枚举类型,为什么需要枚举类型,及如何使用。什么是枚举类型枚举(Enum)是一种数据...

目录
什么是枚举类型
为什么要使用枚举
如何使用枚举
从字典创建枚举
最后的话

你好,我是 征哥,今天分享一下 python 中的枚举类型,为什么需要枚举类型,及如何使用。

什么是枚举类型

枚举(Enum)是一种数据类型,是绑定到唯一值的符号表示。您可以使用它来创建用于变量和属性的常量集。它们类似于全局变量,但是,它们提供了更有用的功能,例如分组和类型安全。Python 在 3.4 版本中添加了标准库 enum。

为什么要使用枚举

使用枚举有以下好处:

代码更容易阅读,更容易维护。

减少由转换或错误输入引起的 bug。

使将来修改值变得更容易。

如何使用枚举

以我们最熟悉的性别为例,先创建一个枚举类型:

>>>fromenumimportEnum
>>>classGender(Enum):
...男=1
...女=0
...未知=2
...
>>>Gender
<enum'Gender'>

访问枚举:

>>>forginGender:
...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
'未知'

接下来,让我们先看看不使用枚举的版本,然后再看看使用枚举的版本,这样就知道枚举的好处了。

以汽车销售为例,我们需要根据不同国家的税率来计算汽车的出售价格。不使用枚举的版本如下:

fromdataclassesimportdataclass

@dataclass
classCar:
model:str
price:float
registraion_state:str

deftotal_cost(self)->float:
matchself.registraion_state:
case"OR":
returnself.price+(self.price*0.05)
case"WA":
returnself.price+(self.price*0.10)
case"CA":
returnself.price+(self.price*0.08)
case_:
raiseTypeError("Invalidregistraion_statevalue")

http://www.cppcns.com
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

接下来,我们来看一看使用枚举版本的代码:

fromdataclassesimportdataclass

fromejsnumimportEnum

classStateTax(Enum):
OR=0.05
WA=0.10
CA=0.08

@dataclass
classCar:
model:str
price:float
tax:StateTax

deftotal_cost(self)->float:
returnself.price+(self.price*self.tax.value)

defget_tax(self):
returnself.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 类的任何代码:

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

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

从字典创建枚举

fromenumimportEnum

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中的枚举类型的文章就介绍到这了,更多相关Python枚举类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!