一、枚举存在的意义
- 枚举存在的意义是它的标签,而不是他背后的数值。
- 每个类中枚举值是独立无二的,枚举值是不能重复的
- 每个枚举类必须继承自Enum
- Python中,枚举实际上是一个类
from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
#如果VIP 是一般的普通类的话,那么VIP.YELLOW 肯定是1,而不是VIP.YELLOW
print(VIP.YELLOW) # VIP.YELLOW
print(VIP.GREEN) # VIP.GREEN
1.1枚举和普通数组相比有什么优势、枚举类型、名称、枚举值
- 一般数据类型是可变的,枚举是不可变得
- 一般数据类型没有防止相同标签得功能,枚举是有防止相同标签的功能
from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
#如果VIP 是一般的普通类的话,那么VIP.YELLOW 肯定是1,而不是VIP.YELLOW
print(VIP.YELLOW) # VIP.YELLOW
print(VIP.GREEN) # VIP.GREEN
print("VIP.GREEN 类型:",type(VIP.GREEN))
#VIP.YELLOW =2 #AttributeError: Cannot reassign members.报错,枚举值不能够被赋值
print("VIP.YELLOW 枚举值:",VIP.YELLOW.value)
print("VIP.GREEN 枚举值:",VIP.GREEN.value)
print("VIP.YELLOW 枚举标签:",VIP.YELLOW.name)
print("VIP.YELLOW 枚举标签类型:",type(VIP.YELLOW.name))
print("VIP.GREEN 枚举标签:",VIP.GREEN.name)
print("VIP['YELLOW']:",VIP['YELLOW'])
class Common():
YELLOW =1 # 虽然定义了一个常量YELLOW,但是在外面任然能够改变YELLOW的值。并不是真正意义上的常量,python中真正意义上的常量只有枚举,这点和C/C++是一样的。
Common.YELLOW =2
print(Common.YELLOW)
print('============================')
#枚举是可以进行遍历的
for v in VIP:
print(v)
1.2 枚举的比较运算
from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
result = VIP.YELLOW == VIP.GREEN
print(result) #False
result = VIP.YELLOW == VIP.YELLOW
print(result) #True
result = VIP.YELLOW is VIP.YELLOW
print(result) #True
result = VIP.YELLOW.value == 1 # VIP.YELLOW.value 这个才真正代表枚举类型的数值
print(result) #True
print("VIP.YELLOW 的类型:",type(VIP.YELLOW))
result = VIP.YELLOW > VIP.GREEN # 这样比较会报错
print(result) #True
1.3 使用枚举需要注意的地方
from enum import Enum
class VIP(Enum):
YELLOW = 1
GREEN = 1
BLACK = 3
RED = 4
print(VIP.GREEN) # 打印出 VIP.YELLOW,奇怪
from enum import Enum
class VIP(Enum):
YELLOW = 1
YELLOW_ALIAS = 1
BLACK = 3
RED = 4
for v in VIP:
print(v) #只会输出 VIP.YELLOW、VIP.BLACK、VIP.RED,不会输出YELLOW_ALIAS
for v in VIP.__members__.items():
print(v) # 会输出全部枚举的详细信息
for v in VIP.__members__:
print(v) # 会输出全部枚举的信息
1.4 枚举类型转换
from enum import Enum
class VIP(Enum):
YELLOW = 1
YELLOW_ALIAS = 1
BLACK = 3
RED = 4
a =1
print(VIP(a)) #输出VIP.YELLOW,通过这种方式 VIP(a),将一个数字转化为枚举类型,是一个很实用的技巧
IntEnum 的用法。
from enum import Enum
from enum import IntEnum,unique
class VIP(Enum):
YELLOW = 1
GREEN = 'str'
BLACK = 3
RED = 4
@unique
class VIP1(IntEnum):
YELLOW = 1
#GREEN = 1 # 一旦用装饰器 @unique,修饰某个枚举类的时候,这个类里面的枚举值是不能重复的。
BLACK = 3
RED = 4
class VIP2(IntEnum):
YELLOW = 1
#GREEN = 'str' # VIP1 集成自 IntEnum,是会报错的,一旦继承自IntEnum 所有的枚举值必须为Int类型的整形值
BLACK = 3
RED = 4
vip = VIP(Enum) # 枚举类型的在python底层实现的是,单例设计模式进行实现的,是不能进行实例化的。