enum模块定义了:

4种枚举类:Enum, IntEnum, Flag, IntFlag

装饰器:unique()

助手:auto

Flag, IntFlag, auto在python3.6中加入

创建枚举

from enum import Enum

class Color(Enum):

RED = 2

GREEN = 4

BLUE = 6

注意点:

1. 枚举值可以是任何类型,如果值不重要可以使用auto()自动选择。但在有其他已定义的值的情况下,谨慎与auto混用

2. Color是枚举类,Color.RED等是枚举成员,枚举成员拥有name和value属性

3. 虽然使用class关键字创建,但枚举并不是常规意义上的python类

枚举成员的展现形式:

>>>print(Color.RED)

Color.RED

>>>print(repr(Color.RED))

枚举成员的type类型是其所属的枚举类:

>>>type(Color.RED)

>>>isinstance(Color.RED, Color)

True

枚举支持按照定义时的顺序进行迭代:

>>>for color in Color:

... print(color)

...

Color.RED

Color.GREEN

Color.BLUE

枚举成员是可哈希的,因此可以在字典和集合中使用:

>>> apples = {}

>>> apples[Color.RED] = 'red delicious'

>>> apples[Color.GREEN] = 'granny smith'

>>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}

True

对枚举成员及其属性的程序化访问

通过值访问枚举成员:

>>>Color(2)

通过名称访问枚举成员:

>>>Color["RED"]

获取枚举成员的名称和值:

>>>member = Color.RED

>>>member.name

"RED"

>>>member.value

2

枚举成员及其值的重复性问题

拥有两个相同名称的枚举成员是不允许的:

>>> class Shape(Enum):

... SQUARE = 2

... SQUARE = 3

...

Traceback (most recent call last):

...

TypeError: Attempted to reuse key: 'SQUARE'

不过不同的枚举成员允许拥有相同的值。后定义的成员是先定义的成员的别名,通过值或名称访问时都将返回先定义的成员:

>>> class Shape(Enum):

... SQUARE = 2

... DIAMOND = 1

... CIRCLE = 3

... ALIAS_FOR_SQUARE = 2

...

>>> Shape.SQUARE

>>> Shape.ALIAS_FOR_SQUARE

>>> Shape(2)

注意点:任意两个枚举属性(包括成员、方法等)不允许存在相同的名称

枚举值唯一约束

默认情况下,允许多个成员拥有相同的值。使用unique装饰器可以对枚举值进行唯一约束

@enum.unique: 枚举专用的类装饰器。它在枚举的__members__属性中只要查找到成员别名就抛出ValueError异常

>>> from enum import Enum, unique

>>> @unique

... class Mistake(Enum):

... ONE = 1

... TWO = 2

... THREE = 3

... FOUR = 3

...

Traceback (most recent call last):

...

ValueError: duplicate values found in : FOUR -> THREE

自动生成枚举值

对于不重要的枚举值,可以使用auto自动生成:

>>> from enum import Enum, auto

>>> class Color(Enum):

... RED = auto()

... BLUE = auto()

... GREEN = auto()

...

>>> list(Color)

[, , ]

auto生成什么值取决于_generate_next_value_()方法,可重写:

>>> 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)

[, , , ]

迭代

对枚举成员的迭代,并不会包含成员别名:

>>> list(Shape)

[, , ]

__members__属性是一个映射了枚举成员及其名称的有序字典,包括成员别名:

>>> for name, member in Shape.__members__.items():

... name, member

...

('SQUARE', )

('DIAMOND', )

('CIRCLE', )

('ALIAS_FOR_SQUARE', )

>>> [name for name, member in Shape.__members__.items() if member.name != name]

['ALIAS_FOR_SQUARE']

枚举比较(后两种不适用于IntEnum)

>>> Color.RED is Color.RED

True

>>> Color.RED == Color.BLUE

False

>>> Color.RED < Color.BLUE

Traceback (most recent call last):

File "", line 1, in

TypeError: '

>>> Color.BLUE == 6 # 与非枚举的值进行等值比较总是返回False

False

允许的枚举成员与属性

枚举是python类,也可以拥有普通方法和特殊方法:

class Mood(Enum):

FUNKY = 1

HAPPY = 3

def describe(self):

# self is the member here

return self.name, self.value

def __str__(self):

return 'my custom str! {0}'.format(self.value)

@classmethod

def favorite_mood(cls):

# cls here is the enumeration

return cls.HAPPY

注意点:如果枚举中定义了__new()__或者__init__()方法,赋值给枚举成员的值将被传递到__new()__或者__init__()中

枚举的继承限制

自定义枚举类必须继承自一个枚举基类,至多一个具体的数据类型以及0至多个混合类。继承顺序如下:

class EnumName([mix-in, ...,] [data-type,] base-enum):

pass

基类枚举如果已经定义了成员,则不能被任何子类继承,如下第一种是不允许的,但第二种可以:

>>> class MoreColor(Color):

... PINK = 17

...

Traceback (most recent call last):

...

TypeError: Cannot extend enumerations

>>> class Foo(Enum):

... def some_behavior(self):

... pass

...

>>> class Bar(Foo):

... HAPPY = 1

... SAD = 2

...

不能这么做的原因是可能破坏某些重要的不允许改变的值(原话是would lead to a violation of some important invariants of bytes and instances)。

序列化

>>> from a.b import Color

>>> from pickle import dumps, loads

>>> Color.RED is loads(dumps(Color.RED))

True

一般要求序列化的枚举要定义在模块顶层,因为反序列化要求枚举能够从模块导入。不过在第4版的pickle协议中,已经可以序列化嵌套在类中的枚举

通过在枚举中定义__reduce_ex__()方法,可以修改枚举成员的序列化/反序列化行为

Functional API

枚举类是可调用的:

>>> Animal = Enum("Pet", "Tortoise CAT DOG")

完整的API如下:

Enum(value='NewEnumName', names=<...>, *, module='...', qualname='...', type=, start=1)

pythonenumapi_python模块之enum_上相关推荐

  1. python enumeration_python模块之enum_上

    enum模块定义了: 4种枚举类:Enum, IntEnum, Flag, IntFlag 装饰器:unique() 助手:auto Flag, IntFlag, auto在python3.6中加入 ...

  2. Apollo进阶课程 ② | 开源模块讲解(上)

    目录 1)无人驾驶车介绍 2)高精地图 3)定位 4)感知 5)轨迹规划 6)控制 7)云端 原文链接:Apollo进阶课程 ② | 开源模块讲解(上) Apollo自动驾驶进阶课程是由百度Apoll ...

  3. 解决python模块安装不上的最强攻略(本人亲测有效)

    在python的学习和工作中我们常常因为某个模块安装不上而苦恼,你有没有过为安装一个小小的模块而从各大网站上寻找攻略的时刻,那么你有没有想过这究竟是为什么,下面是由本人踩了无数个坑而总结的经验,请大家 ...

  4. Adhesive框架系列文章--Mongodb数据服务模块使用(上)

    之前介绍的应用程序信息中心模块中所有日志.异常.性能和状态数据都依赖Mongodb数据服务,Mongodb数据服务的接口也简单的可以: public interface IMongodbInsertS ...

  5. rust怎么进入好友的房间_Rust基础知识-模块系统(上)

    当你开始构建一个大项目的时候,你就能体会到把所有代码都写在一个文件里是多么智障了:不仅难以定位负责某一功能的代码,一大片代码直接糊你脸上也觉得头晕. 当然作为一个现代语言,rust也肯定有相应的措施, ...

  6. NBIOT模块bc20与GPS模块AT1218数据上阿里云物联网平台

    本文章主要实现将GPS模块收集到的经纬度信息上传到阿里云物联网云平台上中,使用NBIOT技术,其通讯模块是移远公司推出的BC20模块,GPS模块是正点原子推出的1218系列模块.         (N ...

  7. 巨控GRM530远程模块与西门子上-300PLC远程上下载程序,远程在线调试程序

    西门子上-300PLC远程上下载程序,远程在线调试程序 一.什么叫做远程上下载西门子S7-300的PLC程序? 远程上下载PLC程序指的是:工程师没有在项目现场,没有在西门子PLC旁边的时候,想要通过 ...

  8. mac java串口驱动,使用CH340/341的模块在Mac上驱动安装

    CH340/341的USB转串口模块在很多Arduino以及NodeMCU的板子上使用,但是其在Mac上往往出现找不到端口的现象,尤其在最新版本的Mac OS X上,主要是由于驱动没有签名引起.可以通 ...

  9. 利用python PIL模块在图片上写文字

    利用PIL模块,简单处理图片 from PIL import Image, ImageFont, ImageDraw # 导入模块 im = Image.open("smile.jpg&qu ...

最新文章

  1. 大触教你如何调节python内置函数
  2. python TypeError: not all arguments converted during string formatting 解决
  3. word或wps中mathtype在工具栏/菜单栏消失的解决方法
  4. linux下初次安装mysql使用指南
  5. easyx 备忘录_记在iPhone备忘录里的便签信息安全吗 - 学显
  6. 广电总局:坚决抵制含有暴力血腥等不良情节动画片上网播出
  7. python3读取excel方法封装_python-excel读写封装
  8. 识别产品外观的合格软件_瑞视特产品贴码字符识别检测系统介绍
  9. java 接口 回调_Java接口回调机制详解
  10. eclipse 主题
  11. trilateration三边测距算法及C语言实现(适用stm32)
  12. 机器学习教程 之 Boosting 与 bagging:集成学习框架
  13. MongoDB 分片集群故障RECOVERING 处理纪实
  14. Qt(c++)调用python一直报错slot、hypot等
  15. 店铺DSR综合评分的计算维度,淘宝店铺评分结算标准
  16. TCP/IP网络编程(一)
  17. 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器
  18. 2022年PMP考试题型都有什么?
  19. linux点用户输密码时就调回登录框,Linux系统登陆输入密码正确 闪回登陆界面
  20. 关于bin和obj文件夹

热门文章

  1. node.js中获取请求当前页的前一页URL地址
  2. .NET 4.0的犄角旮旯
  3. 用vim替代source insight
  4. CListCtrl 使用方法总结
  5. HTML 去调table表单里面td之间的间距
  6. android sdk离线安装
  7. MySQL划重点-查询-聚合
  8. DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots
  9. BestCoder15 1002.Instruction(hdu 5083) 解题报告
  10. P2P之UDP穿透NAT的原理与实现