113 lines
3.3 KiB
Markdown
113 lines
3.3 KiB
Markdown
# 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 | 月份 | |