python之枚举类

今天记录一下关于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等用数值来代表相应的对象
使用枚举类可以直接了当地用对象来代表对象(也就是容易理解变量所代表的意义吧 )
枚举类中可直接赋值方法,通过调用类变量来代表相应的对象
枚举类中定义的变量不可更改且具有唯一性 (对比自定义方法和字典类型,这两者枚举对象可被更改,且枚举对象标签可相同)

好了,今日份学习笔记结束了,如有纰漏,请各位前辈多多指教!!!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值