python3小白课:可以被枚举的类

有时候,我们需要定义一个类似下拉列表条目的东西,这个类是可以被枚举的,比如一年只有四个季节,一年只有12个月等,它们也可以弄成一个类供选择和调用。

直接创建枚举类

来看看小例子吧:

# coding:utf-8
import enum
Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER'))

这里我们定义了一个季节枚举类,有四个季节,用了内置enum包中的Enum函数来构造,第一个参数为枚举类的类名,第二个参数为一个元组,每个元素就是每个枚举值。


访问枚举类中的成员

定义枚举类之后,每个成员都有name和value两个属性,name为枚举值的名称,value为枚举值的序号(从1开始)。

如上述的定义季节的例子,我们就可以这样查看:

# coding:utf-8
import enum
Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER'))

print(Season.SUMMER)
print(Season.SUMMER.name)
print(Season.SUMMER.value)

也可以根据名称或者序号来访问:

# coding:utf-8
import enum
Season = enum.Enum('Season', ('SPRING', 'SUMMER', 'FALL', 'WINTER'))

print(Season['FALL'])
print(Season(1))

还可以通过__members__属性来获取,这个属性可以返回一个字典dict,可以进行解析显示,看例子:

# 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来派生枚举类,可以给新的枚举类定义特有的方法,这是高级定义枚举类的方法:

# 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 月份
Copyright © 雪山凌狐教程 all right reserved,powered by Gitbook该文件修订时间: 2020-07-12 00:18:05

results matching ""

    No results matching ""