枚举function?

我看到了这个页面:

我熟悉这个用Python创建枚举的问题 。 但是,我找不到具有函数的枚举的任何示例。

我主要是一名Java程序员。 我用Java编写了这段代码:

public enum Role { SOLDIER(4), DEMOMAN(2), SCOUT(4), MEDIC(2); private final int maxPlayers; private Role(int maxPlayers) { this.maxPlayers = maxPlayers; } public int getMaxPlayers() { return maxPlayers; } } 

我试图在Python中做同样的事情:

 class Klass: SCOUT = 1 SOLDIER = 2 DEMOMAN = 3 MEDIC = 4 @staticmethod def maxPlayers(klass): return { Klass.SCOUT : 4, Klass.SOLDIER : 4, Klass.DEMOMAN : 2, Klass.MEDIC : 2, }[klass] 

由于某些原因。 我觉得我做错了。 在Python中将函数与枚举关联的最佳实践是什么?

我实际上并不关心建议的答案是否使用枚举; 我只是想了解在Python中实现上述Java代码的最佳实践。

我愿意在下面使用这个枚举:

 class Players(dict): def countKlass(self, klass): count = len(filter(lambda x: x == klass, self.values())) return count 

让我们记住Java中的enum是什么 – 类的static final实例。 它们实际上只是命名常量。

通常,python比Java更倾向于(甚至更喜欢,更灵活)编码风格。 部分原因是没有常数这样的东西,部分原因是信任用户的代码不要做疯狂的事情。 在这种情况下,通过执行以下操作,您可以获得与Java代码类似的效果:

 class Role(object): class RoleType(object): def __init__(self, maxPlayers): self.maxPlayers = maxPlayers SOLDIER = RoleType(4) DEMOMAN = RoleType(2) SCOUT = RoleType(4) MEDIC = RoleType(2) 

然后你可以像这样访问它们

 s = Role.SOLDIER print s.maxPlayers # Prints 4 

这样做不会阻止您的库的用户创建新角色。 但是,这样做有点尴尬,这应该是用户提示“他们做错了”。

 newRole = Role.RoleType(22) # as an example 

如果你走这条路,你或多或少都要接受这个。 如果您赞成使用约定,这通常不会成为问题。 他们总是可以访问您定义的值。

如果您正在寻找最佳实践,通常只需要制作一本字典。

 klass = {'SCOUT':4, 'SOLDIER':4, 'DEMOMAN':2, 'MEDIC':2,} print klass['MEDIC'] 2 

如果你想要这是一个类方法,你可以说:

 class Klass: def maxPlayers(self, klass): return {'SCOUT':4, 'SOLDIER':4, 'DEMOMAN':2, 'MEDIC':2,}[klass] 

这就是你如何使用它:

 print Klass().maxPlayers('MEDIC') 2 

使用AutoEnum配方 ,您的代码可能如下所示:

 class Role(AutoEnum): SCOUT = 4 SOLDIER = 4 DEMOMAN = 2 MEDIC = 2 def __init__(self, max_players): self.max_players = max_players 

现在你可以获得新的Python Enum的好处( 如果没有3.4,则向后移植 ):

 --> Role.SCOUT  --> Role.SCOUT.max_players 4