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

What's the common practice for enums in Python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How can I represent an 'enum' in Python?

在Python中,枚举的常见做法是什么?也就是说,它们是如何在Python中复制的?

1
2
3
4
5
6
7
public enum Materials
{
    Shaded,
    Shiny,
    Transparent,
    Matte
}


1
2
3
4
5
class Materials:
    Shaded, Shiny, Transparent, Matte = range(4)

>>> print Materials.Matte
3


我见过这种模式好几次了:

1
2
3
4
5
6
7
8
>>> 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

您也可以使用类成员,尽管您必须提供自己的编号:

1
2
3
4
5
6
7
>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

如果您正在寻找更健壮的东西(稀疏值、特定于枚举的异常等),请尝试这个方法。


我不知道为什么Python本身不支持枚举。我发现模仿它们的最佳方法是重写str_uu和uueq_uu,这样你就可以比较它们,当你使用print()时,你得到的是字符串而不是数值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

用途:

1
2
3
4
5
>>> s = enumSeason(enumSeason.Spring)

>>> print(s)

Spring


你可能会使用继承结构,尽管我玩得越多,感觉越脏。

1
2
3
4
5
6
7
8
9
10
11
12
class AnimalEnum:
  @classmethod
  def verify(cls, other):
    return issubclass(other.__class__, cls)


class Dog(AnimalEnum):
  pass

def do_something(thing_that_should_be_an_enum):
  if not AnimalEnum.verify(thing_that_should_be_an_enum):
    raise OhGodWhy