今天记录一下关于python枚举类的学习笔记。
在我们的日常学习中,总会遇到列举一些类型对象的问题。
比如说:要求列举出一个水果店中的水果类型:
常规思维:
1-苹果
2-香蕉
3-菠萝
...
引用时用数字来代替类型对象(比如要求进行判断)
fruit =int(input('1-苹果','2-香蕉','3-菠萝'))
if fruit == 1: # 判断是否为苹果
print('this is apple')
简单就这样吧,是不是有点麻烦,且判断条件不加注释,还会降低代码可读性。
所以,当我们引入枚举类来做就简单多了
# 首先得导入库
from enum import Enum # 兼容所有枚举值类型
# 创建一个关于水果的枚举类
class Fruits(Enum):
APPLE = 1
BANANA = 2
PINEAPPLE = 3
a = input('pleace enter fruitname').upper() # 转换为大写
if a in Fruits.__members__: # 判断是否在枚举类中
if a == 'APPLE':
print('this is apple')
if a == 'BANANA':
print('this is banana')
是不是代码可读性就比较强了,下面我们就具体来看看枚举类到底是怎么一回事。
我们以某会员为例 :
class VIP(Enum):
YELLOW = 1
# YELLOW = 1 TypeError: Attempted to reuse key: 'YELLOW'
GREEN = 2
BLACK = 3
RED = 4
class VIP1(Enum):
YELLOW = 1
YELLOW_MAX = 'str'
GREEN = 2
BLACK = 3
RED = 4
对比自定义函数:
class VIP(Enum):
YELLOW = 1
# YELLOW = 1 # 对象标签不可相同
#TypeError: Attempted to reuse key: 'YELLOW'
GREEN = 2
BLACK = 3
RED = 4
class VIP:
YELLOW = 1 YELLOW = 2 # 对象标签可相同
GREEN = 2
BLACK = 3
RED = 4
VIP_type.RED = 3 # 可被修改
VIP.RED = 3 # 不可被修改
AttributeError: Cannot reassign members.
获取枚举类标签的对应名字和取值
print(VIP.GREEN.name) # 输出对应名字 GREEN
print(VIP.GREEN.value) # 输出对应数值 2
VIP.GREEN 与 VIP.GREEN.name 的区别
print(type(VIP.GREEN.name)) # <class 'str'>
print(type(VIP.GREEN)) # <enum 'VIP'>
# .name 属性得到的是一个字符串类型的名字,
#这个名字对应相应的取值 GREEN = 2
# VIP.GREEN 得到的是一个枚举类型
通过标签名称获取名称所对应的枚举类型
print(VIP['RED']) # VIP.RED
# 枚举类型:VIP.RED ; 枚举名字:RED ;枚举值:4 (以VIP.RED举例区别)
可遍历枚举获取其下的所有枚举类型
for item in VIP:
pass # print(item)
# VIP.RED
# VIP.YELLOW
# VIP.GREEN
# VIP.BLACK
# VIP.RED
枚举的比较运算
1. 等值比较(对比的是枚举类型所对应的值相比较,不支持大小比较)
re = VIP.BLACK == VIP.RED # False
re1 = VIP.BLACK == VIP.BLACK # True
re2 = VIP.BLACK == 3 # False
re3 = VIP.BLACK > VIP.GREEN
# TypeError: '>' not supported between instances of 'VIP' and 'VIP'
2. 身份比较
re4 = VIP.RED is VIP.RED # True
3. 不同枚举类之间比较(VIP与VIP1)
re5 = VIP.RED == VIP1.RED # False
# 两个不同枚举类之间即使枚举值相同也不可进行比较
枚举注意事项:
1. 枚举类型下不能有两个相同的标签
class VIP(Enum):
YELLOW = 1
YELLOW = 1 # TypeError: Attempted to reuse key: 'YELLOW'
2. 枚举标签对应的数值不可相同(相同的话前者标签会覆盖后者,但不会报错,相当于后者是前者的一个别名)
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 1 # 相当于YELLOW的一个别名,不被遍历
print(VIP.YELLOW) # VIP.YELLOW
print(VIP.BLACK) # VIP.YELLOW 打印BLACK标签,输出YELLOw标签
3. 如何遍历有别名的枚举
class VIP1(Enum):
YELLOW = 1
YELLOW_MAX = 1
GREEN = 2
BLACK = 3
RED = 4
for item in VIP1.__members__: # 只遍历标签名称
print(item)
YELLOW
YELLOW_MAX
GREEN
BLACK
RED
for item in VIP1.__members__.items(): # 遍历标签对应的数值
print(item)
('YELLOW', <VIP1.YELLOW: 1>)
('YELLOW_MAX', <VIP1.YELLOW: 1>)
('GREEN', <VIP1.GREEN: 2>)
('BLACK', <VIP1.BLACK: 3>)
('RED', <VIP1.RED: 4>)
4. 枚举转换:(用于数据库存储枚举类型的读取)
枚举类型可在数据库中建立相关字段存储枚举值,然后用枚举转换将其转换为枚举类型
# 假设读取数据库中存储的枚举值enum_value
enum_value = 3
print(VIP(enum_value)) # VIP.BLACK
5. unique装饰器,限制枚举值唯一
from enum import unique # 装饰器,限制枚举值唯一
@unique
class VIP(Enum):
YELLOW = 1
GREEN = 1
BLACK = 3
RED = 4
# ValueError: duplicate values found in <enum 'VIP'>: GREEN -> YELLOW
6. IntEnum 枚举值类型只能是数值型
from enum import IntEnum # 枚举值类型只能是数值型
class VIP1(IntEnum):
YELLOW = 1
YELLOW_MAX = 'str'
GREEN = 2
BLACK = 3
RED = 4
# ValueError: invalid literal for int() with base 10: 'str'
关于枚举类的演示就这些吧,对于枚举类大概做如下总结:
代替了用数值来作为对象
例如:1-YELLOW;2-GREEN;3-BLACK;4-RED等用数值来代表相应的对象
使用枚举类可以直接了当地用对象来代表对象(也就是容易理解变量所代表的意义吧 )
枚举类中可直接赋值方法,通过调用类变量来代表相应的对象
枚举类中定义的变量不可更改且具有唯一性 (对比自定义方法和字典类型,这两者枚举对象可被更改,且枚举对象标签可相同)
好了,今日份学习笔记结束了,如有纰漏,请各位前辈多多指教!!!