python 枚举

一、枚举存在的意义

  1. 枚举存在的意义是它的标签,而不是他背后的数值。
  2. 每个类中枚举值是独立无二的,枚举值是不能重复的
  3. 每个枚举类必须继承自Enum
  4. 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枚举和普通数组相比有什么优势、枚举类型、名称、枚举值

  1. 一般数据类型是可变的,枚举是不可变得
  2. 一般数据类型没有防止相同标签得功能,枚举是有防止相同标签的功能
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底层实现的是,单例设计模式进行实现的,是不能进行实例化的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

repinkply

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值