我看到了这个页面:
我熟悉this SO question用于在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
答案 0 :(得分:3)
让我们记住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
如果你走这条路,你或多或少都要忍受这个。如果您赞成使用约定,这通常不会成为问题。他们总是可以访问您定义的值。
答案 1 :(得分:2)
如果您正在寻找最佳做法,通常只需要制作字典。
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
答案 2 :(得分:1)
使用AutoEnum recipe,您的代码可能如下所示:
class Role(AutoEnum):
SCOUT = 4
SOLDIER = 4
DEMOMAN = 2
MEDIC = 2
def __init__(self, max_players):
self.max_players = max_players
现在您可以获得新的Python Enum(backported if you don't have 3.4)的好处:
--> Role.SCOUT
<Role.SCOUT: 3>
--> Role.SCOUT.max_players
4