枚举功能?

时间:2013-10-23 13:21:17

标签: java python enums

我看到了这个页面:

我熟悉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

3 个答案:

答案 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