ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python枚举类

2022-05-05 03:00:07  阅读:179  来源: 互联网

标签:Python value Color 枚举 green print red


前言

枚举类是一些具有特殊含义的类,比如用一个类表示月份,则该类的实例对象最多有 12 个,一周则有7个对象,Python 3.4 中新增加了 Enum 枚举类,对于这些实例化对象个数固定的类,可以用枚举类来定义。

枚举类定义

  • 只需要令其继承自 enum 模块中的 Enum 类,则证明这是一个枚举类
  • 枚举类的每个成员都由 2 部分组成,分别为 name 和 value
  • name不允许重复,value允许重复
  • 和普通类的用法不同,枚举类不能用来实例化对象
  • 枚举类中各个成员的值,不能在类的外部做任何修改

创建方式一

from enum import Enum
# 第一个参数用于指定枚举类的类名,第二个参数用于指定枚举类中的多个成员。
Colors = Enum("Colors", ('red', 'green', 'blue')) # 未指定值,默认从 1 开始递增
print(Colors.red.value)
print(Colors.green.value)
print(Colors.blue.value)
### 运行结果
1
2
3

创建方式二

from enum import Enum
class Color(Enum):
    # 为序列值指定value值
    red = 1
    green = 2
    blue = 3
	
#调用枚举成员的 3 种方式
print(Color.red)
print(Color['red'])
print(Color(1))
#调取枚举成员中的 value 和 name
print(Color.red.value)
print(Color.red.name)
#遍历枚举类中所有成员的 2 种方式
for color in Color:
    print(color)

### 运行结果:
Color.red
Color.red
Color.red
1
red
Color.red
Color.green
Color.blue

使用

1.正常使用

print(Color.red == Color.green)
print(Color.red.name is Color.green.name)
### 运行结果
Flase
Flase

2.不能在类的外部做任何修改,下面语法的做法是错误的:

Color.red = 4
报错:
    raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.

3.枚举类中各个成员必须保证 name 互不相同,但 value 可以相同,举个例子:

class Color(Enum):
    # 为序列值指定value值
    red = 1
    green = 1
    blue = 3
print(Color['green'])

### 运行结果
Color.red

可以看到,Color 枚举类中 red 和 green 具有相同的值(都是 1),Python 允许这种情况的发生,它会将 green 当做是 red 的别名,因此当访问 green 成员时,最终输出的是 red。

4.设置value唯一性,不允许出现相同的value

#引入 unique
from enum import Enum,unique
#添加 unique 装饰器
@unique
class Color(Enum):
    # 为序列值指定value值
    red = 1
    green = 1
    blue = 3
print(Color['green'])

### 运行结果报错:
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    class Color(Enum):
  File "/python3.6/lib/enum.py", line 834, in unique
    (enumeration, alias_details))
ValueError: duplicate values found in <enum 'Color'>: green -> red

标签:Python,value,Color,枚举,green,print,red
来源: https://www.cnblogs.com/bigcarcar/p/16223190.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有