# python3小白课:可以被枚举的类 有时候,我们需要定义一个类似下拉列表条目的东西,这个类是可以被枚举的,比如一年只有四个季节,一年只有12个月等,它们也可以弄成一个类供选择和调用。 ### 直接创建枚举类 来看看小例子吧: ```python # coding:utf-8 import enum Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER')) ``` 这里我们定义了一个季节枚举类,有四个季节,用了内置enum包中的`Enum`函数来构造,第一个参数为枚举类的类名,第二个参数为一个元组,每个元素就是每个枚举值。 --- ### 访问枚举类中的成员 定义枚举类之后,每个成员都有name和value两个属性,name为枚举值的名称,value为枚举值的序号(从1开始)。 如上述的定义季节的例子,我们就可以这样查看: ```python # coding:utf-8 import enum Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER')) print(Season.SUMMER) print(Season.SUMMER.name) print(Season.SUMMER.value) ``` 也可以根据名称或者序号来访问: ```python # coding:utf-8 import enum Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER')) print(Season['FALL']) print(Season(1)) ``` 还可以通过`__members__`属性来获取,这个属性可以返回一个字典dict,可以进行解析显示,看例子: ```python # coding:utf-8 import enum Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER')) print(Season.__members__) for name, member in Season.__members__.items(): print("%s => %s, %s" % (name, member.name, member.value)) ``` --- ### 为枚举类定义额外方法 通过继承`Enum`来派生枚举类,可以给新的枚举类定义特有的方法,这是高级定义枚举类的方法: ```python # coding:utf-8 import enum class Season(enum.Enum): # 先指定value值,不一定要是数字 SPRING = '春' SUMMER = '夏' FALL = '秋' WINTER = '冬' # 可以定义特有的方法 def get_month(self): if self.value == '春': month = "1-3月" elif self.value == '夏': month = "4-6月" elif self.value == '秋': month = "7-9月" elif self.value == '冬': month = "10-12月" print("这是一个在【%s】的季节" % month) # 用各种方式来查看这样定义的结果展现 print(Season.WINTER) print(Season.WINTER.name) print(Season.WINTER.value) Season.FALL.get_month() for name, member in Season.__members__.items(): print("%s => %s, %s" % (name, member.name, member.value)) ``` 可以看到,通过这样的高级枚举,我们可以定义特有的方法,做一些针对性的处理等等。如有需要,可以选用。 ### 单词释义 | 单词 | 释义 | | ------ | ------------------------- | | enum | 列举型别 | | Season | 季节 | | SPRING | 春季 | | SUMMER | 夏季 | | FALL | 秋季 | | WINTER | 冬季 | | name | 名称 | | value | 值 | | member | 成员,members为复数形式 | | item | 一件物品,items为复数形式 | | get | 获取 | | month | 月份 |