Python枚举教程展示了如何在Python中使用枚举。枚举是Python3.4中引入的新数据类型。
Python枚举
枚举是一组绑定到唯一常量值的符号名称。枚举可用于创建简单的自定义数据类型,其中包括季节、周、游戏中的武器类型、行星、等级或天数等内容。按照惯例,枚举名称以大写字母开头并且是单数。
enum
模块用于在Python中创建枚举。枚举是使用class
关键字或函数式API创建的。
有特定的派生枚举enum.IntEnum
、enum.IntFlag
和enum.Flag
。
Python枚举简单例子
下面是一个Python枚举的简单例子。
#!/usr/bin/python from enum import Enum class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4 seas = Season.SPRING print(seas) if seas == Season.SPRING: print("Spring") print(list(Season))
在示例中,我们有一个Season
枚举,它有四个不同的值:SPRING、SUMMER、AUTUMN和WINTER。要访问成员,我们指定枚举名称后跟一个点和成员名称。
class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4
Season
枚举是使用class
关键字创建的。我们继承自enum.Enum
基类。我们明确地将数字设置为枚举值。
seas = Season.SPRING print(seas)
一个枚举值被分配给一个变量,它被打印到控制台。
if seas == Season.SPRING: print("Spring")
Season.SPRING
用于if表达式。
print(list(Season))
使用list
内置函数,我们可以获得Season
枚举的所有可能值的列表。
$ ./simple.py Season.SPRING Spring [<Season.SPRING: 1>, <Season.SUMMER: 2>, <Season.AUTUMN: 3>, <Season.WINTER: 4>]
Python枚举简单例子二
下一个示例展示了Python枚举的其他一些基本功能。
#!/usr/bin/python from enum import Enum class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4 seas = Season.SPRING print(seas) print(isinstance(seas, Season)) print(type(seas)) print(repr(seas)) print(Season['SPRING']) print(Season(1))
同样,我们处理使用class
创建的Season
枚举。
print(seas)
在这里,我们打印了一个人类可读的字符串表示形式,表示Season
成员。
print(isinstance(seas, Season))
使用isinstance
方法,我们检查变量是否具有Season
类型的值。
print(type(seas))
type
函数打印变量的类型。
print(repr(seas))
repr
函数提供了有关枚举的更多信息。
print(Season['SPRING']) print(Season(1))
可以通过项目名称和索引访问枚举成员。
$ ./simple2.py Season.SPRING True <enum 'Season'> <Season.SPRING: 1> Season.SPRING Season.SPRING
Python枚举函数创建
Python枚举可以使用函数式API创建。
#!/usr/bin/python from enum import Enum Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1) seas = Season.SUMMER print(seas) if seas == Season.SUMMER: print("Summer")
我们可以通过多种方式使用函数式API指定值。在后面的示例中,我们将使用其他函数式方式。
Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1)
此处的值在字符串中指定,以空格分隔。start
提供初始值。
$ ./functional.py Season.SUMMER Summer
Python枚举迭代
我们可以迭代Python枚举。
#!/usr/bin/python from enum import Enum Season = Enum('Season', ['SPRING', 'SUMMER', 'AUTUMN', 'WINTER'], start=5) for season in Season: print(season) for season in Season: print(season.name, season.value)
在此示例中,我们创建了一个Season
枚举,其中的值设置在字符串列表中。
for season in Season: print(season)
我们在for循环中迭代枚举成员。
for season in Season: print(season.name, season.value)
我们在这里打印它们的名称和值。
$ ./iteration.py Season.SPRING Season.SUMMER Season.AUTUMN Season.WINTER SPRING 5 SUMMER 6 AUTUMN 7 WINTER 8
Python枚举自动值
Python枚举值可以使用auto
函数自动设置。
#!/usr/bin/python from enum import Enum, auto class Season(Enum): SPRING = auto() SUMMER = auto() AUTUMN = auto() WINTER = auto() for season in Season: print(season.value)
我们有一个Season
枚举,它的成员通过auto
函数获得一个值。
$ ./automatic.py 1 2 3 4
Python枚举唯一成员值
可以使用@unique
装饰器强制Python枚举的成员值是唯一的。
#!/usr/bin/python from enum import Enum, unique @unique class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 3 # WINTER = 4 for season in Season: print(season)
该示例因ValueError:duplicatevaluesfoundin:WINTER->AUTUMN
错误而失败,因为AUTUMN和WINTER成员具有相同的值。如果我们注释掉@unique
装饰器,该示例将打印三个成员;WINTER被忽略。
Python枚举__members__
特殊属性__members__
是名称到成员的只读有序映射。
#!/usr/bin/python from enum import Enum Season = Enum('Season', [('SPRING', 1), ('SUMMER', 2), ('AUTUMN', 3), ('WINTER', 4)]) for name, member in Season.__members__.items(): print(name, member)
在示例中,我们使用了__members__
属性。枚举成员是使用函数式API使用元组列表创建的。
$ ./members.py SPRING Season.SPRING SUMMER Season.SUMMER AUTUMN Season.AUTUMN WINTER Season.WINTER
Python枚举.Flag
enum.Flag
是一个基类,用于创建枚举常量,可以使用按位运算组合这些常量而不会丢失其Flag成员身份。
#!/usr/bin/python from enum import Flag, auto class Perm(Flag): EXECUTE = auto() WRITE = auto() READ = auto() print(list(Perm)) print(Perm.READ | Perm.WRITE)
该示例显示了如何在权限上使用Flag
。
$ ./derived.py [<Perm.EXECUTE: 1>, <Perm.WRITE: 2>, <Perm.READ: 4>] Perm.READ|WRITE
带有模式匹配的Python枚举
match/case
关键字可以与枚举一起使用以创建简洁的代码。
#!/usr/bin/python from enum import Enum import random class Day(Enum): Monday = 0 Tuesday = 1 Wednesday = 2 Thursday = 3 Friday = 4 Saturday = 5 Sunday = 6 days = [Day.Monday, Day.Tuesday, Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday] res = random.sample(days, 4) for e in res: match e: case Day.Monday: print("monday") case Day.Tuesday: print("tuesday") case Day.Wednesday: print("wednesay") case Day.Thursday: print("thursday") case Day.Friday: print("friday") case Day.Saturday: print("saturday") case Day.Sunday: print("sunday")
在示例中,我们定义了一个Day枚举。
days = [Day.Monday, Day.Tuesday, Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday] res = random.sample(days, 4)
我们从列表中随机选择四天。
for e in res: match e: case Day.Monday: print("monday") case Day.Tuesday: print("tuesday") case Day.Wednesday: print("wednesay") case Day.Thursday: print("thursday") case Day.Friday: print("friday") case Day.Saturday: print("saturday") case Day.Sunday: print("sunday")
我们检查四个选择的值并打印它们相应的字符串表示。对于每个选项,我们都有一个特定的案例组。
$ ./pattern_match.py monday friday thursday sunday
在本教程中,我们使用了Python枚举。
列出所有Python教程。