如何写"纠正"枚举的成员函数?

时间:2017-04-20 08:58:30

标签: python enums

请参阅此代码:

from __future__ import print_function
from enum import Enum

class AType(Enum):
    A = 1
    B = 2

    def as_key(self):
        if self.name == AType.A:
            return 'key for As'
        else:
            return 'some other key'

print(AType.A.as_key())
print(AType.B.as_key())

来自java世界;我原以为它打印

key for As
some other key

但我明白了:

some other key
some other key

可能超级简单,但是编写这样一个成员函数的正确方法是什么,它根据"枚举常量"给出一个结果。我在?

上调用方法

1 个答案:

答案 0 :(得分:3)

首先,为了解决这个问题:self.name已经是关键,所以

def as_key(self):
    return self.name

但是我认为这不是你想要的 - 这个函数可能只是一个基本的例子,你想编写更复杂的函数,根据枚举做不同的事情。

Enum值是单一的 - AType.A将始终返回完全相同的对象(而不是字符串"A",每次都可以创建一个新对象 - 尽管作为优化如果它仍在内存中,则literal将始终返回相同的对象。

此外,在方法中,self是实际的枚举对象 - AType.AAType.B

所以 - 只需将self与枚举值进行比较:

def as_key(self):
    if self is AType.A:
        return 'A'
    elif self is AType.B:
        return 'B'
    else:
        assert False, 'Unknown AType %s' % (self,)

BTW:Python中的is运算符相当于Java中的== - 它检查确切的对象标识(它是内存中相同位置的相同对象)。 Python的==运算符等同于Java的equals()方法 - 可以自定义它以比较对象的值。