Python的枚举类
程序员文章站
2022-03-04 14:24:21
...
当我们需要定义确定的一组变量的时候,我们可以使用字典以kv方式进行实现,但是Python也给我们提供了另一种更为好用的方式,这就是枚举类。
1、简单方式
通常我们需要定义类似月份,周,时分秒这样的具有固定值的一组常量的时候会采用以下方式。(以周为例)
week = {1:'zhouyi',2:'zhouer',3:'zhousan',4:'zhousi',5:'zhouwu',6:'zhouliu',7:'zhouqi'}
如上,我们用1到7代表周一到周七。
现在我们使用这个变量week:dict来实现判断今天是周几的功能。
文件名:meiju.py
week = {1:'zhouyi',2:'zhouer',3:'zhousan',4:'zhousi',5:'zhouwu',6:'zhouliu',7:'zhouqi'}
def get_today_week(d):
return week[d+1]
执行:
>>> import meiju
>>> import datetime
>>> today = datetime.date.today().weekday()
>>> meiju.get_today_week(today)
'zhouliu'
>>> today
5
>>> datetime.date.today()
datetime.date(2020, 9, 12) #2020-9-12确实是周六
>>>
2、使用枚举类的方式
以上方式可以简单的实现我们想要的功能,但是存在数据可能被修改,值重复等不优雅的地方。
重新以枚举类的方式定义week:
from enum import Enum
class week(Enum):
zhouyi=1
zhouer=2
zhousan=3
zhousi=4
zhouwu=5
zhouliu=6
zhouqi=7
def get_today_week(d):
for i in week:
if i.value == d:
return i.name
执行:
>>> import meiju
>>> import datetime
>>> today=datetime.date.today().weekday()
>>> meiju.get_today_week(today)
'zhouliu'
>>>
3、枚举类的优点
3.1、枚举类的常量无法被修改
>>> meiju.week
<enum 'week'>
>>> meiju.week.zhouliu
<week.zhouliu: 6>
>>> meiju.week.zhouliu.value
6
>>> meiju.week.zhouliu.value = 9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Python37\lib\types.py", line 175, in __set__
raise AttributeError("can't set attribute")
AttributeError: can't set attribute
>>>
3.2、枚举类可以优雅的处理值重复
修改下枚举类week:
from enum import Enum
class week(Enum):
zhouyi=1
zhouer=2
zhousan=3
zhousi=4
zhouwu=5
zhouliu=6
zhouqi=7
zhouri=7
执行:
>>> import meiju
>>> meiju.week.zhouri.name
'zhouqi'
>>>
当存在枚举成员的名称有重复时,则后面的枚举成员相当于第一个枚举成员的别名,而且在实际使用中,就是使用的第一次出现的枚举成员。
查看所有成员名:
>>> meiju.week.__members__
mappingproxy(OrderedDict([('zhouyi', <week.zhouyi: 1>), ('zhouer', <week.zhouer: 2>), ('zhousan', <week.zhousan: 3>), ('zhousi', <week.zhousi: 4>), ('zhouwu', <week.zhouwu: 5>), ('zhouliu', <week.zhouliu: 6>), ('zhouqi', <week.zhouqi: 7>), ('zhouri', <week.zhouqi: 7>)]))
因为zhouqi的值和zhouri相同,又因为zhouqi在前面,所以zhouri是zhouqi的别名。
3.3、枚举类有方法保证枚举类型唯一
重新修改下枚举类week(使用unique装饰器):
from enum import Enum,unique
@unique
class week(Enum):
zhouyi=1
zhouer=2
zhousan=3
zhousi=4
zhouwu=5
zhouliu=6
zhouqi=7
zhouri=7
zhouri=8
执行:
>>> import meiju
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Administrator\Desktop\document\meiju.py", line 14, in <module>
class week(Enum):
File "C:\Users\Administrator\Desktop\document\meiju.py", line 23, in week
zhouri=8
File "D:\Python37\lib\enum.py", line 100, in __setitem__
raise TypeError('Attempted to reuse key: %r' % key)
TypeError: Attempted to reuse key: 'zhouri'
>>>
提示zhouri枚举类型已经被使用。
枚举类的其他优点可以查看官方文档或者源码进行学习探索。
往期推荐
好文!必须在看