1. 枚举类的定义
枚举的属性用于定义一组不可变的相关常量值,这些值可能具有语义意义,也可能不具有语义意义
比如月份,周几等等可以用枚举类来定义。
枚举类有两种定义方法:
- 自定义类继承Enum
from enum import Enum
class Test(Enum):
# 类成员
rock = 0
paper = 1
scissors = 2
- 使用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
得到的都是枚举类型的对象,该对象有两个属性name
和value
。name
为字符串,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. 注意点
使用枚举类时有以下几点需要注意:
- 枚举类的成员之间不仅可以比较大小;但可以用
is
或==
判断是否相同 - 成员在类的外部无法修改; 比如
Test.rock = xxx
是非法操作 __members__
属性是一个字典,以键值对的形式存储了枚举类中的所有name:value
。{'rock': <Test.rock: ('rock', '石头')>, 'paper': <Test.paper: ('paper', '布')>, 'scissors': <Test.scissors: ('scissors', ' 剪刀')>}