欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python的枚举类

程序员文章站 2022-03-04 14:24:21
...

Python的枚举类

当我们需要定义确定的一组变量的时候,我们可以使用字典以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枚举类型已经被使用。

枚举类的其他优点可以查看官方文档或者源码进行学习探索。

Python的枚举类

往期推荐

RobotFrameWork简明教程全套

selenium简明教程全套

Python的封装继承多态和多重继承

好文!必须在看