目录
什么是枚举类?
对象有限且固定的类;(比如季节类,只包括春夏秋冬四个对象)
1. 两种方式定义枚举类
1)直接使用Enum()函数列出多个枚举值来创建枚举类;
from enum import Enum
# 定义Season枚举类
Season = Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER'))
# 第一个参数值为枚举类的类名,第二个参数值为一个元组,用于列出所有的枚举对象
定义的四个枚举对象都有name、value两个属性,name为该枚举对象的对象名,value代表该对象在枚举值中的序号(从1开始):
# 测试枚举对象两个属性的用法
print(Season.SPRING) # Season.SPRING
print(Season.SUMMER.name) # SUMMER
print(Season.FALL.value) # 3
程序可以通过枚举对象名或者枚举对象序号值访问枚举对象:
print(Season['SPRING']) # Season.SPRING
print(Season(2)) # Season.SUMMER 注意是括号
python还为枚举提供了一个__members__属性,该属性返回一个dict字典,字典包含所有的枚举对象:
print(Season.__members__)
# OrderedDict([('SPRING', <Season.SPRING: 1>), ('SUMMER', <Season.SUMMER: 2>), ('FALL', <Season.FALL: 3>), ('WINTER', <Season.WINTER: 4>)])
print(Season.__members__.items())
# odict_items([('SPRING', <Season.SPRING: 1>), ('SUMMER', <Season.SUMMER: 2>), ('FALL', <Season.FALL: 3>), ('WINTER', <Season.WINTER: 4>)])
为对象新建实例变量或者方法,枚举对象用“ 类名.对象名 ”表示:
Season.SPRING.day = 31+28+31
print(Season.SPRING.day) # 90
def inf():
print("春天")
Season.SPRING.des = inf
Season.SPRING.des() # 春天
2)通过继承Enum类定义枚举类(可以定义自己的方法)
from enum import Enum
class Season(Enum):
# 创建枚举对象并指定value值
SPRING = "1"
SUMMER = "2"
FALL = "3"
WINTER = "4"
def inf(self):
if self.value == '1':
print("春天")
elif self.value == '2':
print("夏天")
elif self.value == '3':
print("秋天")
else:
print("冬天")
print(Season.SPRING) # Season.SPRING
print(Season.SPRING.name) # SPRING
print(Season.SPRING.value) # 1 这个1是字符串类型
print(Season['SPRING']) # Season.SPRING
Season.SPRING.inf() # Season.SPRING
2. 枚举类定义构造函数
from enum import Enum
class Season(Enum):
# 创建枚举对象并指定value值,超过一个值Python会自动将其封装成一个元组传给value
SPRING = "1", "春天"
SUMMER = "2", "夏天"
FALL = "3", "秋天"
WINTER = "4", "冬天"
# 因为枚举类对象已经确定,所以构造函数不会用于创建新对象,其主要作用是映射对象的value值,
# value值有几个元素,构造函数就有几个参数(不包括参数self)
def __init__(self, num, ch_name):
self.num = num
self.ch_name = ch_name
# value值以元组形式输出
print(Season.SPRING.value) # ('1', '春天')
# num、ch_name分别映射value元组的每个元素
print(Season.SPRING.num)
print(Season.SPRING.ch_name)