Python枚举类

1. 枚举类的定义

枚举的属性用于定义一组不可变的相关常量值,这些值可能具有语义意义,也可能不具有语义意义

比如月份,周几等等可以用枚举类来定义。

枚举类有两种定义方法:

  1. 自定义类继承Enum
from enum import Enum

class Test(Enum):
	# 类成员
    rock = 0
    paper = 1
    scissors = 2
  1. 使用Enum定义枚举类
from enum import Enum

Test = Enum('Test', ('rock', 'paper', 'scissors'))

# 当类成员的value不重要时可以用上述方法定义枚举类,name可自定义,value会自动编号
# Enum接收两个参数
1. 枚举类名
2. 元组--枚举类中的成员名name,value自动编号从1开始

2. 枚举类的使用

枚举类无法进行实例化,通过类对象调用类成员。

from enum import Enum

class Test(Enum):
    rock = 0
    paper = 1
    scissors = 2


print(Test)  # <enum 'Test'>
print(Test.rock)  # Test.rock  type:枚举类型
print(Test['rock'])  # Test.rock  type:枚举类型
print(Test(0))  # Test.rock  type:枚举类型

print(Test.rock.name)  # rock  type:字符串
print(Test.rock.value)  # 0  type:int

for test in Test:
    print(test)
    #  Test.rock  type:枚举类型
    #  Test.paper
	#  Test.scissors

通过枚举类.xxx得到的都是枚举类型的对象,该对象有两个属性namevaluename为字符串,value根据定义的情况对应不同的类型。


将上述例子稍作修改

from enum import Enum

class Test(Enum):
    def __new__(cls, English, Chinese):
        obj = object.__new__(cls)
        obj.English = English
        obj.Chinese = Chinese
        return obj

    rock = ('rock', '石头')
    paper = ('paper', '布')
    scissors = ('scissors', '剪刀')


print(Test.rock.value)  # ('rock', '石头')  元组
print(Test.rock.English)  # rock 字符串
print(Test.rock.Chinese)  # 石头 字符串

枚举类中的name必须是唯一的,value可以相同;具有相同value的name可以看做是别名。
比如

from enum import Enum

class Test(Enum):
    rock = ('rock', '石头')
    paper = ('paper', '布')
    scissors = ('scissors', '剪刀')
    rocks = ('rock', '石头')


print(Test.rocks)  # Test.rock
print(Test.rock)  # Test.rock
print(Test.rocks.name)  # rock

可以看到,当我们想要获取Test.rocks的信息的时候,由于他的value和rock相同。因此python会认为他是rock的别名,返回的都是rock的信息。

当然,如果你要避免value重复,可以使用@unique装饰器装饰枚举类;此时如果类中有value相同的成员就会抛出异常。

from enum import Enum, unique

@unique
class Test(Enum):
    rock = ('rock', '石头')
    paper = ('paper', '布')
    scissors = ('scissors', '剪刀')
    rocks = ('rock', '石头')
Traceback (most recent call last):
  File "e:\code\python\py_study\test.py", line 4, in <module>
    class Test(Enum):
  File "D:\py\lib\enum.py", line 865, in unique
    raise ValueError('duplicate values found in %r: %s' %
ValueError: duplicate values found in <enum 'Test'>: rocks -> rock

3. 注意点

使用枚举类时有以下几点需要注意:

  1. 枚举类的成员之间不仅可以比较大小;但可以用is==判断是否相同
  2. 成员在类的外部无法修改; 比如Test.rock = xxx是非法操作
  3. __members__属性是一个字典,以键值对的形式存储了枚举类中的所有name:value{'rock': <Test.rock: ('rock', '石头')>, 'paper': <Test.paper: ('paper', '布')>, 'scissors': <Test.scissors: ('scissors', ' 剪刀')>}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值