Python高级编程枚举的用法

枚举(Enumeration)是一种数据类型,每个枚举值都是一个实例枚举的每个成员都有一个名称和一个相关联的数值。 具备相关特性:
可读性:在代码中使用明确命名的枚举值而不是字面常量,可以提高可读性。
维护性:枚举集中管理一系列相关的常量,方便修改和维护。 
类型安全:相比于使用一组无关联的字面量(如整数或字符串),枚举作为一种自定义类型,能提供编译时的类型安全检查。 
逻辑分组:枚举提供了一种逻辑上将相关常量分组的方式,如颜色、方向、状态、性质等。
防止非法值篡改:枚举值必须是预先定义的成员之一,这防止了非法值的赋值和使用。

#导入模块
from enum import Enum

class vip(Enum):
    yello  = 1
    black  = 2
    red = 3
    
print(vip.yello)  
## 以上 不是普通的类,如果普通的类,打印结果应该是1
## 然而打印结果是vip.yello

#(1) 用全局变量表示枚举 
yello  = 1
green = 1 

#(2) 用字典表示枚举
{'yellow':1,'green':2}

#(3) 一般类表示枚举class
class typediamond():
    yello  = 1
    green  = 2
#####  其实以上三种的不适合,以上后两种都是可变,就是说可以更改值;并且没有防止相同标签的功能
m = {'yellow':1,'green':2}
m['yellow'] = 3
print(m) ## 这时值做了更改,同样普通的类也是可以轻易更改
"""## 然而

m = {'yellow':1,'green':1}
print(m)

与
class typediamond():
    yello  = 1
    green  = 1
    
不同标签对应相同的值,普通类和字典是可以的"""

## 枚举是不可以更改的,以下语句就报错
class vip(Enum):
    yello  = 1
    black  = 2
    red = 3
print(vip.yello)  
vip.yellow = 6
## 枚举不能运用重复的标签,如下
class vip (Enum):
    yello  = 1
    yello  = 2
    red = 3
print(vip.yello)

##如何获取枚举标签对应的值   用.value
class vip(Enum):
    yello  = 1
    black  = 2
    red = 3
print(vip.yello) #outcome  :vip.yello
print(vip.yello.value) # outcome :1 获取枚举标签对应的值
print(vip.yello.name) # 通过.nmae属性获取标签名称 outcome : yello
print(type(vip.yello)) # <enum 'vip'> 这个是表示枚举下面的类型
print(type(vip.yello.name)) #<class 'str'> 这个是表示字符串  两则的区别
print(vip['yello'])# outcome: vip.green

#枚举类型
#枚举的的名称
#枚举的值 
## 枚举是可以遍历的
class vip(Enum):
    yello  = 1
    black  = 2
    red = 3
for i in vip:
    print(i)
## outcome :vip.yello,vip.black ,vip.red 
     
 ## 枚举之间可以做等值比较  但是不能够做大小比较,也可以做身份比较is操作符
class vip(Enum):
    yello  = 1
    black  = 2
    red = 3
"""result = vip.yello > vip.black
print(result) 大小比较报错 """  
"""result = vip.yello == vip.yello
print(result)  #  等值比较 outcome : True"""
"""result = vip.yello is vip.yello
print(result)#  身份比较  outcome : True"""
     
class vip(Enum):
    yello  = 1
    black  = 1 #  这里不能够出现相同标签 比如两个yello ,但是标签的值是可以相同的 
    red = 3   
print(vip.black) # outcome: vip.yello.可以理解成yello 是black 的别名,打印出别名
     
class vip (Enum):
    yello  = 1
    yello_as  = 1 
    red = 3
for i in vip:
    """当标签对应的值是重复的,只会遍历其中一个另外一个标签会舍掉"""    
    print(i)  
### outcome : vip.yello vip.red    

### 但是有时候又需要把这种重复的别名打印出来见下面俩个语句

class vip(Enum):
    yello  = 1
    yello_as  = 1 
    red = 3
for i in vip.__members__.items():
    print(i) 

class vip(Enum):
    yello  = 1
    yello_as  = 1 
    red = 3
for i in vip.__members__:
    print(i) 

## 枚举转换 查找枚举类型

class vip (Enum):
    yello  = 1
    black  = 2
    red = 3 
A = 1
print(vip(A))# outcome :vip.yellome 枚举类型

""" ----------------------------"""
## #### 另外一个模块 IntEnum,与 Enum区别
from enum import IntEnum
class vip(IntEnum):
    yello  = 1
    black  = 'sd'
    red = 3  #  这个时候报错,InEnum,标签对应的值必须是整型 不能是字符串
print(vip.yello)

from enum import IntEnum
class vip(IntEnum):
    yello  = 1
    black  = 2
    red = 3
print(vip.yello)#  这个时候不报错,IntEnum,标签对应的值必须是整型 


from enum import Enum
class vip(Enum):
    yello  = 1
    black  = 'sd'
    red = 3  
print(vip.yello)

### unique 装饰器的用法,用装饰器 unique 就是提示你标签对应的值有重复
from enum import Enum,unique
@unique
class vip(Enum):
    yello  = 1
    black  = 1
    red = 3  
## outcome:ValueError: duplicate values found in <enum 'vip'>: black -> yello
## 就是说重复了两个值1

# 以下语句也是同理
from enum import IntEnum,unique
@unique
class vip(IntEnum):
    yello  = 1
    black  = 1
    red = 3   
### 枚举相对于其他普通类 是莫得实例化的 ,也是二者区别 
  • 21
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wxid_0nh5zxp5lcdo22

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

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

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

打赏作者

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

抵扣说明:

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

余额充值