说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置库 enum 提供了枚举类型的支持,枚举是用来定义常量的,枚举元素具有不可变的特性。enum 可以为值创建具有良好定义的标识符,而不是直接使用字面上的字符串或者整数。
创建一个季节的枚举:
from enum import Enum
# 快速定义类并创建实例, 值自动从 1 开始分配
Season = Enum('Season', ('Spring', 'Summer', 'Autumn', 'Winter'))
# 访问实例
Season.Spring
# <Season.Spring: 1>
Season(4)
Season['Winter']
Season.Winter
# <Season.Winter: 4>
Season.Winter.name
# 'Winter'
# 访问实例名称和值
Season.Winter.name
# 'Winter'
Season.Winter.value
# 4
# 遍历枚举类中所有成员
for i in Season:
print(i)
'''
Season.Spring
Season.Summer
Season.Autumn
Season.Winter
'''
for name, member in Season.__members__.items():
print(name, ':', member, ',', member.value)
'''
Spring : Season.Spring , 1
Summer : Season.Summer , 2
Autumn : Season.Autumn , 3
Winter : Season.Winter , 4
'''
精确地控制枚举类型:
from enum import Enum, unique
# @unique 装饰器保证没有重复值
@unique
class Season(Enum):
Spring = 1 # 自由设置值
Summer = 4
Autumn = 7
Winter = 10
计算机在存储重复的内容时一般不不喜存存储大量重复类型的数据的具体值,而是保存具体值的符号,比如如 1 代表男,0 代表女。这样的好处时,可以节省空间,0 和 1 参与计算,编码和对外显示仍然显示男女。
枚举是与唯一常量值绑定的一系列符号名称(成员)的集合。枚举中的元素可以进行恒等比较,并且枚举本身可迭代。
例如,对于圆周率,我们在 Python 中简单定义 PI = 3.14,但 PI 是变量,是可以被修改的,故更严格地定义常量需要用到枚举。
一些具有特殊含义的类,其实例化对象的个数往往是固定的,比如用一个类表示月份,则该类的实例对象最多有 12 个;再比如用一个类表示季节,则该类的实例化对象最多有 4 个。
针对这种特殊的类,Python 3.4 中新增加了 Enum 枚举类。
枚举表示的是常量,因此,建议枚举成员名称使用大写字母。
enum 模块定义了四个枚举类,用来定义名称与值的唯一组合:Enum、IntEnum、Flag和IntFlag。此外,还定义了一个装饰器 unique() 和一个辅助类 auto。
class enum.Enum
:创建枚举常量的基类。class enum.IntEnum
:创建 int 子类枚举常量的基类。class enum.Flag
:创建可与位运算符搭配使用,而又不失去 Flag 成员资格的枚举常量的基类。class enum.IntFlag
:创建可与位运算符搭配使用,而又不失去 IntFlag 成员资格的枚举常量的基类。enum.unique()
:Enum 类的装饰器,确保一个名称只绑定一个值。class enum.auto
:用合适的值代替 Enum 成员的实例。初始默认值从 1 开始。3.6 新版功能: Flag, IntFlag, auto。
定义一个 http 响应状态的枚举:
from enum import Enum
class HttpStatus(Enum):
OK = 200
BAD_REQUEST = 400
FORBIDDEN = 403
NOT_FOUND = 404
REQUEST_TIMEOUT = 408
SERVICE_UNAVAILABLE = 500
如果确切的值不重要,你可以使用 auto 自动赋值, 从 1 开始:
from enum import Enum, auto
class Season(Enum):
Spring = auto()
Summer = auto()
Autumn = auto()
Winter = auto()
[*Season]
'''
[<Season.Spring: 1>,
<Season.Summer: 2>,
<Season.Autumn: 3>,
<Season.Winter: 4>]
'''
值将由特殊方法 _generate_next_value_()
来选择,该函数可以被重载:
from enum import Enum
class AutoName(Enum):
def _generate_next_value_(name, start, count, last_values):
return name
class Ordinal(AutoName):
NORTH = auto()
SOUTH = auto()
EAST = auto()
WEST = auto()
list(Ordinal)
'''
[<Ordinal.NORTH: 'NORTH'>,
<Ordinal.SOUTH: 'SOUTH'>,
<Ordinal.EAST: 'EAST'>,
<Ordinal.WEST: 'WEST'>]
'''
默认 _generate_next_value_()
方法的目标是提供所给出的最后一个 int 所在序列的下一个 int,但这种行为方式属于实现细节并且可能发生改变。此方法定义必须在任何其他成员之前。
枚举成员是按标识号进行比较的:
>>> Color.RED is Color.RED
True
>>> Color.RED is Color.BLUE
False
>>> Color.RED is not Color.BLUE
True
枚举值之间的排序比较 不被 支持。 Enum 成员不属于整数 (另请参阅下文的 IntEnum):
Color.RED < Color.BLUE
'''
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Color' and 'Color'
'''
相等比较的定义如下:
>>> Color.BLUE == Color.RED
False
>>> Color.BLUE != Color.RED
True
>>> Color.BLUE == Color.BLUE
True
与非枚举值的比较将总是不相等(同样地,IntEnum 被显式设计成不同的行为,参见下文):
>>> Color.BLUE == 2
False
更新时间:2022-06-29 17:14:33 标签:python 枚举