我想要一个带有预定义单字符常量的枚举(适合存储在数据库中)和字符串解释。这就是我的想法:
class Fruits(Enum):
APPLE = 'A'
PEAR = 'P'
BANANA = 'B'
def __unicode__(self):
if self == APPLE: return "Crunchy Apple"
if self == PEAR: return "Sweet Pear"
if self == BANANA: return "Long Banana"
但是
fruit = Fruits.APPLE
print fruit.__unicode__()
给出
AttributeError: 'unicode' object has no attribute '__unicode__'
此外必须有一种更优雅的方式来做这件事
如何做得更好?
答案 0 :(得分:4)
一些观察结果:
您不应该直接调用__dunder__
方法;而是使用匹配命令:unicode
而不是__unicode__
我无法复制您的问题
使用stdlib Enum
(3.4+)或enum34
backport(Python 2.x),你必须以艰难的方式去做 - 制作你自己的基础Enum
类:< / p>
class EnumWithDescription(Enum):
def __new__(cls, value, desc):
member = object.__new__(cls)
member._value_ = value
member.description = desc
return member
def __unicode__(self):
return self.description
class Fruits(EnumWithDescription):
_order_ = 'APPLE PEAR BANANA' # if using Python 2.x and order matters
APPLE = 'A', 'Crunchy Apple'
PEAR = 'P', 'Sweet Pear'
BANANA = 'B', 'Long Banana'
并在使用中:
>>> fruit = Fruits.APPLE
>>> unicode(fruit)
u'Crunchy Apple'
如果你可以使用aenum library
1 ,你将会更容易:
from aenum import Enum
class Fruits(Enum, init='value description'):
APPLE = 'A', 'Crunchy Apple'
PEAR = 'P', 'Sweet Pear'
BANANA = 'B', 'Long Banana'
def describe(self):
return self.description
并在使用中:
fruit = Fruits.APPLE
fruit.describe()
请注意,由于{3}是Python 3中的默认值,因此我将名称更改为unicode
。
1 披露:我是Python stdlib Enum
,enum34
backport和Advanced Enumeration (aenum
)图书馆的作者。
答案 1 :(得分:-1)
enum34模块有你想要的。
from enum import Enum
class Fruits(Enum):
apple = 'A'
pear = 'P'
banana = 'B'
fruit = Fruits.apple
print fruit.value
>> 'A'
可能更好的是使用整数
from enum import Enum
class Fruits(Enum):
apple = 1
pear = 2
banana = 3
fruit = Fruits.apple
print fruit.value
>> 1
如果您使用以下方法获取对象(例如,来自数据库),则重新创建对象:
fruit = Fruits(1)