详解Python中的枚举类型

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

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

什么是枚举类型

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

时间: 2022-08-09

Python中模拟enum枚举类型的5种方法分享

以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码 代码如下: # way1 class Directions:     up = 0     down = 1     left = 2     right =3     print Directions.down # way2 dirUp, dirDown, dirLeft, dirRight = range(4) print dirDown # way3 import collections dircoll=collections.

python模拟enum枚举类型的方法小结

本文实例总结了python模拟enum枚举类型的方法.分享给大家供大家参考.具体分析如下: python中没有enum枚举类型,可能python认为这玩意压根就没用,下面列举了三种方法模拟enum枚举类型 方法1. 使用自定义类 class Numbers(object): ONE = 1 TWO = 2 THREE = 3 assert Numbers.ONE == 1 assert Numbers.TWO == 2 assert Numbers.THREE == 3 方法2:使用函数动态创建

Python中的枚举类型示例介绍

起步 Python 的原生类型中并不包含枚举类型.为了提供更好的解决方案,Python 通过 PEP 435 在 3.4 版本中添加了 enum 标准库. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等.在没有专门提供枚举类型的时候我们是怎么做呢,一般就通过字典或类来实现: Color = { 'RED' : 1, 'GREEN': 2, 'BLUE' : 3, } class Color: RED = 1 GREEN = 2 BLUE =

深入了解Python枚举类型的相关知识

枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们可以通过很多方法来实现它,例如字典.类等: MiracleLove = {'MON': '林志玲', 'TUS': '陈意涵', 'WEN': '张柏芝', 'THU': '辛芷蕾', 'FRI': '周冬雨'} class MiracleLove: MON = '林志玲' TUS = '陈意涵' WEN

Python解析json文件相关知识学习

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等).这些特性使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成. 今天用pytho

图解python全局变量与局部变量相关知识

这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解一下作用域 a = 10 def func(): b = 20 def inner(): c = 30 以上面这个程序为例:打印a,b,c 可以看到只有a打印 10 ,b和c都报错,这就是作用域的问题. 我们把新创建的一个.py文件看做事一个模块,在模块内定义的变量,如a,就是这个模块的全局变量,作

深入解析Swift编程中枚举类型的相关使用

枚举是由用户定义的数据类型的一组相关值.关键字 enum 用来定义枚举数据类型. 枚举功能 枚举在 swift 也类似于 C 和 Objective C 中结构类型 它是在一个类中声明,其值是通过该类的实例来访问 初始成员值是用枚举初始化定义的 其功能也扩展确保标准的协议功能 语法 枚举引入 enum 关键字和一对大括号内将它们定义: 复制代码 代码如下: enum enumname {    // enumeration values are described here } 例如,可以为星期

Python列表list操作相关知识小结

当然,温习的同时也要发散思考,因为有些看似无关紧要的.约定俗成的语言习惯,例如数组索引为何从0开始,其背后可能大有来历.知其然,亦需知其所以然啊喵喵喵~~~ 最后,在基础知识之上,更要探索进阶,例如学习生成器表达式,这样既能更扎实地掌握基础,又能融会贯通,获得更全面的认知升级. Python的列表是怎样滴? 列表(list)是一种有序的集合,可以随时添加.查找和删除元素. 列表支持加入不同数据类型的元素:数字.字符串.列表.元组等. 列表通过有序的索引可遍历所有的元素,从前往后数,索引是[0,n

介绍Ruby中的模块与混合类型的相关知识

模块是组合在一起的方法,类和常量.模块两个主要好处: 模块提供了一个命名空间,并避免名称冲突. 模块实现混合工厂. 模块定义了一个命名空间,一个沙箱中方法和常量可以自由使用,而不必担心踩到其他的方法和常数. 语法: module Identifier statement1 statement2 ........... end 就像被命名为类常量模块中的常量,首字母大写.定义的方法看起来很相似,模块定义方法就像类的方法. 调用一个模块方法和类方法一样,通过模块的名称它名字前,引用一个常数使用该模块

简单了解python协程的相关知识

什么是协程 协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的 通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的 协程和线程的差异 在实现多任务时,线程会自己欢子一些数据,操作系统切换时需

关于python的list相关知识(推荐)

如下所示,一起跟随小编过来看看吧! list01 = ['alex',12,65,'xiaodong',100,'chen',5] list02 = [67,7,'jinjiao_dawang','relax1949',53]   #打印list01.list02 print(list01) print(list02)   #列表截取.切片 print(list01[1]) print(list01[-2]) print(list01[1:3])   #列表重复 print(list01 * 3

JAVA 枚举相关知识汇总

Java 枚举 知识点 概念 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum 关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, GREEN, BLUE } 如果枚举不添加任何方法,枚举值默认为从0开始的有序数值.以 Color 枚举类型举例,它的枚举常量依次为 RED:0,GREEN:1,BLUE:2. 枚举的好处:可以将常量组织起来,统一进行管理. 枚举的典型应用场景:错误码.状态机等. 枚举类型的本质