2014-10-26 61 views
7

可以说我有一个枚举器,是否有可能获得随后的属性?因此,如果我有today=Days.Sunday,我可以做类似tomorrow=today.next()的事情吗?获取下一个枚举器常量/属性

例如:

class Days(Enum): 
    Sunday = 'S' 
    Monday = 'M' 
    ... 
    Saturday = 'Sa' 

我知道我可以使用元组(如下图所示),像做tomorrow=today[1],但我希望有内置的或更优雅的东西。

class Days(Enum): 
    Sunday = ('S','Monday') 
    Monday = ('M','Tuesday') 
    ... 
    Saturday = ('Sa','Sunday') 
+1

创建某种迭代器? – 2014-10-26 20:45:28

+0

感谢@PadraicCunningham,会比我的元组解决方案更高效吗?我更喜欢你,我只是好奇,如果它会节省内存或运行时间:) – Parker 2014-10-26 22:07:39

回答

7

绝对。

只需添加所需的功能,以您的Days类:

class Days(Enum): 

    Sunday = 'S' 
    Monday = 'M' 
    Tuesday = 'T' 
    Wednesday = 'W' 
    Thursday = 'Th' 
    Friday = 'F' 
    Saturday = 'Sa' 

    def next(self): 
     cls = self.__class__ 
     members = list(cls) 
     index = members.index(self) + 1 
     if index >= len(members): 
      index = 0 
     return members[index] 

,并使用:

today = Days.Wednesday 
print(today.next()) 
# Days.Thursday 
2

您可以创建一个字典查找,第二天像这样:

In [10]: class Days(Enum): 
    Sun = 'Su' 
    Mon = 'M' 
    Tue = 'Tu' 
    Wed = 'W' 
    Thu = 'Th' 
    Fri = 'F' 
    Sat = 'Sa' 

In [11]: days = list(Days) 

In [12]: nxt = dict((day, days[(i+1) % len(days)]) for i, day in enumerate(days)) 

快速测试:

In [13]: nxt[Days.Tue] 
Out[13]: <Days.Wed: 'W'> 

In [14]: nxt[Days.Sat] 
Out[14]: <Days.Sun: 'Su'>