Python中枚举的常见做法是什么?

153 投票
4 回答
136772 浏览
提问于 2025-04-15 11:04

我该如何在Python中实现一个枚举类型(在某些语言中拼写为enum)?通常大家是怎么做到的呢?

4 个回答

9

我也不知道为什么Python不直接支持枚举(Enums)。我找到的最好的方法是重写 _str_ 和 _eq_ 这两个方法,这样你就可以比较它们,并且当你使用print()时,可以显示字符串而不是数字值。

class enumSeason():
    Spring = 0
    Summer = 1
    Fall = 2
    Winter = 3
    def __init__(self, Type):
        self.value = Type
    def __str__(self):
        if self.value == enumSeason.Spring:
            return 'Spring'
        if self.value == enumSeason.Summer:
            return 'Summer'
        if self.value == enumSeason.Fall:
            return 'Fall'
        if self.value == enumSeason.Winter:
            return 'Winter'
    def __eq__(self,y):
       return self.value==y.value

用法:

>>> s = enumSeason(enumSeason.Spring)

>>> print(s)

Spring
21

我见过这个模式好几次:

>>> class Enumeration(object):
        def __init__(self, names):  # or *names, with no .split()
            for number, name in enumerate(names.split()):
                setattr(self, name, number)

>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

你也可以直接使用类里面的成员,不过你得自己给它们编号:

>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

如果你想要更强大的功能(比如稀疏值、特定枚举的异常等等),可以试试这个方法

374

更新:适用于 Python 3.4 及以上版本:

class Materials:
    Shaded, Shiny, Transparent, Matte = range(4)

>>> print Materials.Matte
3

从 Python 3.4 版本开始,你可以使用 Enum(如果是整数值的枚举,可以用 IntEnum)来自 enum 模块。你可以使用 enum.auto 来自动增加这些值:

import enum


class Materials(enum.IntEnum):
    Shaded = 1
    Shiny = enum.auto()
    Transparent = 3
    Matte = enum.auto()


print(Materials.Shiny == 2)  # True
print(Materials.Matte == 4)  # True

撰写回答