# 这是学习廖雪峰老师python教程的学习笔记

1、概览

当我们需要定义有规律的常量时,比如月份。我们可以用Enum类来实现这个功能

1.1、直接使用Enum类

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

>>> type(Month)

定义了一个枚举类型的Month类,其中每个常量都是Month类的一个唯一实例。

 

# 枚举Month的所有成员

for name, member in Month.__members__.items():

    print(name, '=>', member, ',', member.value)

 

Jan => Month.Jan , 1

Feb => Month.Feb , 2

参数分析

name:Month中的每个常量名

member:Month中的每个实例

member.value:value属性则是自动赋给成员的int常量,默认从1开始计数

# 使用

>>> Month.Jan  # 直接引用一个常量,比如使用Month.Jan

>>> Month(1)  # 通过value值来显示

# 看下Month的内部结构

>>> list(Month)      # 我们可以看到,Month内部,每个实例和value组成了键值对

[, , , , ,

 , , , ,

, , ]

注:Month里的键值对是由Enum('Month', ('Jan',…)里的Month,Jane,value,共同组合而成。例如

>>> Gender=Enum('gender',('Male','Female'))

>>> list(Gender)

[<gender.Male: 1>, ]

 

 

1.2、从Enum派生出自定义类

如果需要更精确地控制枚举类型,可以从Enum派生出自定义类使用

from enum import Enum, unique

@unique # @unique装饰器可以帮助我们检查保证没有重复值

class Weekday(Enum):

    Sun = 0 # 自定义Value

    Mon = 1

    Tue = 2

    Wed = 3

    Thu = 4

    Fri = 5

    Sat = 6

 

参数分析

常量名:Sun,Mon,…

实例:Weekday.Sun,Weekday.Mon,…

Value值:0,1,2,…

 

# Weekday的结构

>>> list(Weekday)

[, , , ,

y.Thu: 4>, , ]

 

# print(实例) 和 直接使用实例 的区别

>>> print(Weekday.Tue)  # print,只显示实例名

Weekday.Tue

>>> Weekday.Tue  # 直接使用实例,显示键值对

>>> print(Weekday(1))

Weekday.Mon

>>> Weekday(1)

 

1.3、总结

既可以用成员名称引用枚举常量【Month.Jan】,又可以直接根据value的值获得枚举常量【Month(1)

 

2、例子

1、把Studentgender属性改造为枚举类型,可以避免使用字符串:

# -*- coding: utf-8 -*-

 

from enum import Enum, unique

方法一:使用Enum的派生类

class Gender(Enum): 

    Male = 0

    Female = 1

方法二:直接使用Enum

Gender = Enum('Gender', ('Male', 'Female'))

 

class Student(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

# 测试:
bart = Student('Bart', Gender.Male)
if bart.gender == Gender.Male:
    print('测试通过!')
else:
    print('测试失败!')