2

我看到了页面:

我熟悉这个在 Python 中创建枚举的 SO question。但是,我在任何地方都找不到具有函数的枚举示例。

我主要是一名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
4

3 回答 3

3

让我们记住enumJava 中 s 的真正含义——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

如果你走这条路,你或多或少必须忍受它。但是,如果您喜欢使用约定,这通常不会成为问题。他们总是可以访问您定义的值。

于 2013-10-23T14:11:52.643 回答
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
于 2013-10-23T14:04:15.790 回答
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 的好处(如果您没有 3.4 则向后移植):

--> Role.SCOUT
<Role.SCOUT: 3>
--> Role.SCOUT.max_players
4
于 2013-10-23T14:51:01.803 回答