Python 枚举【一】

转载自:
https://www.cnblogs.com/ucos/p/5896861.html

Python 枚举【一】

1. 枚举的定义

首先,定义枚举要导入enum模块。
枚举定义用class关键字,继承Enum类。
用于定义枚举的class和定义类的class是有区别【下一篇博文继续分享】。
  示例代码:

from enum import Enum
    
class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7

复制代码
  代码分析:

上面的代码,我们定义了颜色的枚举Color.
颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】
1.1 定义枚举时,成员名称不允许重复

from enum import Enum

class Color(Enum):
    red = 1
    red = 2

上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: ‘red’

1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名

from enum import Enum

class Color(Enum):  
    red = 1
    red_alias = 1

成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员

from enum import Enum

class Color(Enum):
    red = 1
    red_alias = 1

print(Color(1))

复制代码
  输出结果为:Color.red

1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

from enum import Enum, unique

@unique
class Color(Enum):
    red = 1
    red_alias = 1

再执行就会提示错误:ValueError: duplicate values found in <enum ‘Color’>: red_alias -> red

2. 枚举取值

2.1 通过成员的名称来获取成员

Color[‘red’]

2.2 通过成员值来获取成员

Color(2)

2.3 通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

3. 迭代器

3.1 枚举支持迭代器,可以遍历枚举成员

for color in Color:
    print(color)

输出结果是,枚举的所有成员。Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

from enum import Enum


class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color:
    print(color)

复制代码
  输出结果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并没有出现在输出结果中。

3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__

from enum import Enum


class Color(Enum):
    red = 1
    orange = 2
    yellow = 3
    green = 4
    blue = 5
    indigo = 6
    purple = 7
    red_alias = 1


for color in Color.__members__.items():
    print(color)

复制代码
  输出结果:(‘red’, <Color.red: 1>)、(‘orange’, <Color.orange: 2>)、(‘yellow’, <Color.yellow: 3>)、(‘green’, <Color.green: 4>)、(‘blue’, <Color.blue: 5>)、

(‘indigo’, <Color.indigo: 6>)、(‘purple’, <Color.purple: 7>)、(‘red_alias’, <Color.red: 1>)

4. 枚举比较

4.1 枚举成员可进行同一性比较

Color.red is Color.red
  输出结果是:True

Color.red is not Color.blue
  输出结果是:True

4.2 枚举成员可进等值比较

Color.blue == Color.red
  输出结果是:False

Color.blue != Color.red
  输出结果是:True

4.3 枚举成员不能进行大小比较

Color.red < Color.blue
  输出结果出错:TypeError: unorderable types: Color() < Color()

### Python 枚举的使用方法 #### 枚举简介 Python 枚举种用于定义固定值的数据类型,这有助于提高代码的可读性和可维护性[^1]。 #### 创建枚举类 在 Python 中,可以通过 `enum` 模块创建枚举类。自版本 3.4 起,Python 添加了 `enum` 标准库以支持枚举类型的实现[^2]。 ```python from enum import Enum, auto class Color(Enum): RED = 1 GREEN = 2 BLUE = 3 ``` 上述例子展示了如何基于整数值定义个简单的枚举类 `Color`。还可以利用 `auto()` 函数自动分配成员值: ```python class Status(Enum): PENDING = auto() STARTED = auto() COMPLETED = auto() ``` #### 访问枚举成员及其属性 可以像访问常规变量样获取枚举成员,并能查看其名称和关联的值: ```python print(Color.RED.name) # 输出: 'RED' print(Color.RED.value) # 输出: 1 ``` #### 遍历枚举成员 如果想要遍历整个枚举集合,则可以直接迭代该枚举类的对象: ```python for color in Color: print(f"{color.name} -> {color.value}") ``` 这段代码会依次打印出所有颜色的名字以及它们对应的编号。 #### 将枚举转换成字符串或整数 有时可能需要将枚举实例转为其他形式以便于存储或者传输。对于这种情况,可以分别调用 `.name` 和 `.value` 属性来获得所需的结果;而当要从外部数据恢复到具体的枚举项时,通常采用如下方式之: - **通过名字查找**:假设有个名为 `status_name` 的字符串变量保存着状态名,则可通过 `Status[status_name.upper()]` 来得到相应枚举; - **通过值匹配**:如果有代表某种状态的整型变量 `status_value` ,则可以用 `(Status(status_value))` 进行反序列化操作。 #### 枚举的应用场景 枚举非常适合用来处理那些具有有限数量选项的情况,比如星期几、月份、性别等概念,在这些场合下运用枚举能够显著增强程序逻辑表达力并减少错误发生的可能性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值