class Seasons:
Spring=0
Summer= 1
Autumn=2
Winter= 3
print (Seasons.Spring)
0
上面的例子可以直接简化为:
class Seasons:
Spring,Summer,Autumn,Winter=range(4)
def enum (*posarg, **keysarg):
return type("Enum", (object,), dict(zip(posarg, range(len(posarg))), ** keysarg))
Seasons = enum ("Spring", "Summer", "Autumn", Winter=1)
Seasons.Spring
0
import collections
Seasons = collections.namedtuple('Seasons', ' Spring Summer Autumn Winter')._make(range(4))
print(Seasons . Spring )
0
Python中枚举的替代实现方式远不止上述这些,在此就不一一列举了。 那么,既然枚举 在Python中有替代的实现方式,为什么人们还要执着地提出各自建议要求语言实现枚举呢? 显然,这些替代实现有其不合理的地方。
- 允许枚举值重复。以
collections.namedtuple
为例, 下面的例子中枚举值Spring
与Autumn
相等,但却不会提示任何错误。
Seasons._replace(Spring =2)
Seasons(Spring=2, Summer=1, Autumn=2, Winter=3)
- 支持无意义的操作。
sudo apt install python3-flufl.enum
# !pip install flufl.enum
值得一提的是,Python3.4中根据PEP435的建议终于加入了枚举 Enum
。
其实现主要参考实现 flufi.enumt
但两者之间还是存在一些差别,
如 flufl.enum
允许枚举继承,而 Enum
仅在父类没有任何枚举成员的时候才允许继承等。
另外,如果要在Python3.4之前的版本中使用枚举 Enum
,
可以安装 Enum
的向后兼容包 enum34
。