Python3: 枚举 enum

淡淡的烟草味﹌ 2021-09-21 22:38 506阅读 0赞

本文链接: https://blog.csdn.net/xietansheng/article/details/115557456

Python3 学习笔记(目录)

1. 枚举的定义与使用

1.1 枚举定义

和定义类一样,枚举使用class关键字定义。枚举元素的类型为枚举类型本身(即每个元素都是枚举类型的实例),每个元素有两个固定属性(name 和 value),name 属性区分不同的枚举元素(即不能重复)。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import enum # 导入枚举模块
  4. class Color(enum.Enum): # 定义一个名为 Color 的枚举(继承 enum.Enum)
  5. red = 1 # 定义枚举元素: name 为 "red", value 为 1
  6. green = 2
  7. blue = 3
  8. red_alias = 1

1.2 枚举元素的访问

  1. print(Color.red) # 引用枚举元素, 输出: Color.red
  2. print(Color["red"]) # 通过 name 引用枚举元素, 输出: Color.red
  3. print(Color(1)) # 通过 value 检索元素(返回最先匹配的元素), 输出: Color.red
  4. print(type(Color.red)) # 元素的类型为枚举类型 Color, 输出: <enum 'Color'>
  5. print(type(Color)) # 枚举类型的类型为类 enum.EnumMeta, 输出: <class 'enum.EnumMeta'>
  6. print(Color.red.name) # 输出: "red"
  7. print(Color.red.value) # 输出: 1

1.3 枚举元素的比较

枚举元素支持等值比较,不支持大小的比较。

  1. # 枚举元素的 == 和 != 比较的是其 value 值, value 值相等则枚举元素相等
  2. print(Color.red == Color.red_alias) # 输出: True
  3. print(Color.red != Color.green) # 输出: True
  4. # 枚举元素的 is 和 is not 比较的是也是其 value 值(相当于 == 和 !=)
  5. print(Color.red is Color.red_alias) # 输出: True
  6. print(Color.red is not Color.green) # 输出: True

1.4 枚举元素的遍历

枚举元素的遍历,普通的遍历 value 相同的元素只输出 1 次。

  1. for c in Color:
  2. print(c) # 逐次输出: Color.red
  3. # Color.green
  4. # Color.blue

枚举类型有一个特殊属性__members__,表示枚举类型的所有元素的name->value映射列表。

  1. # 遍历 Color.__members__, 迭代变量的值为 name
  2. for name in Color.__members__:
  3. print(name, Color[name]) # 逐次输出: "red" Color.red
  4. # "green" Color.green
  5. # "blue" Color.blue
  6. # "red_alias" Color.red_alias
  7. # 遍历 Color.__members__.items(), 迭代变量的值为 name, Color
  8. for name, c in Color.__members__.items():
  9. print(name, c) # 逐次输出: "red" Color.red
  10. # "green" Color.green
  11. # "blue" Color.blue
  12. # "red_alias" Color.red_alias

2. @enum.unique 装饰器

默认情况下,枚举的不同元素的 value 值允许相同,如果多个 value 值相同的成员,则后面的成员将被视为第一个成员的别名。

如果需要确保运行时枚举元素的 value 值唯一,可以使用@enum.unique装饰器修饰枚举类型。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import enum # 导入枚举模块
  4. @enum.unique # 使用 @enum.unique 修饰枚举类型, 如果存在 value 值相同的元素, 运行时将报错
  5. class Color(enum.Enum): # 定义一个名为 Color 的枚举(继承 enum.Enum)
  6. red = 1 # 定义枚举元素: name 为 "red", value 为 1
  7. green = 2
  8. blue = 3

3. 枚举类型中添加方法

枚举类型不但能添加类型元素,还能和普通类一样添加方法。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import enum
  4. @enum.unique
  5. class Color(enum.Enum):
  6. """ 一个枚举类 """
  7. red = 1
  8. """ 枚举元素 red """
  9. green = 2
  10. blue = 3
  11. def fun(self):
  12. """ 枚举对象的方法, self 表示枚举对象(元素) """
  13. print("Enum:", self.name, "->", self.value)
  14. @staticmethod
  15. def static_fun():
  16. """ 枚举类的静态方法 """
  17. print("static_fun")
  18. @classmethod
  19. def class_fun(cls):
  20. """ 枚举类的类方法, cls 表示枚举类型 Color """
  21. print("class_fun:", cls)
  22. Color.red.fun() # 通过枚举对象(元素)调用对象方法, 输出: Enum: red -> 1
  23. Color.static_fun() # 通过枚举类型直接调用静态方法, 输出: static_fun
  24. Color.class_fun() # 通过枚举类型直接调用类方法, 输出: class_fun: <enum 'Color'>

4. 动态创建枚举类型

一般定义枚举类型通过class关键字在代码中定义,通过enum.Enum(...)构造方法也可以在运行时动态创建和一个枚举类型。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import enum
  4. # 定义一个枚举类型
  5. # 第 1 个字符串参数表示枚举类型名称(等号左边的 Color 仅为变量名称, 可以是任意合法标识符)
  6. # 第 2 个元组参数表示所有枚举元素的名称(name), 其中元素的 value 值默认为从 1 开始的整数
  7. Color = enum.Enum("Color", ("red", "green", "blue"))
  8. # 遍历
  9. for c in Color:
  10. print(c, ":", c.name, "->", c.value) # 输出: Color.red : red -> 1
  11. # Color.green : green -> 2
  12. # Color.blue : blue -> 3
  13. print(Color.red) # 输出: Color.red
  14. print(Color["red"]) # 输出: Color.red
  15. print(Color(1)) # 输出: Color.red
  16. print(type(Color.red)) # 输出: <enum 'Color'>
  17. print(Color) # 输出: <enum 'Color'>
  18. print(type(Color)) # 输出: <class 'enum.EnumMeta'>

发表评论

表情:
评论列表 (有 0 条评论,506人围观)

还没有评论,来说两句吧...

相关阅读

    相关 (enum)

    前言 实际上,枚举类型是特殊的类,和C语言C++中的枚举不太一样,下面我们做详细说明。关于枚举类型有一个单独的设计模式:即单例设计模式。单例类是一个类只有一个实例,那么多

    相关 enum

    枚举类型enum C++中,枚举类型(enumeration) 是一个被命名的整型常量的集合。和类一样,每个枚举类型定义了一种新的类型。枚举属于字面值常量类型。C++包含

    相关 类(enum

    【1】什么是枚举类?     实例(也叫对象)有限且固定不变的类,在Java里被称为枚举类。     例如,季节类,它只有4个实例(春、夏、秋、冬),并且这4个实例不