我想要一个带有预定义的单字符常量(适合存储在数据库中)和字符串解释的枚举。这是我的想法:
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"
Run Code Online (Sandbox Code Playgroud)
但
fruit = Fruits.APPLE
print fruit.__unicode__()
Run Code Online (Sandbox Code Playgroud)
给出
AttributeError: 'unicode' object has no attribute '__unicode__'
Run Code Online (Sandbox Code Playgroud)
除此之外,还必须有一种更优雅的方式来做到这一点
怎样才能做得更好呢?
一些观察:
你不应该__dunder__直接调用方法;而是使用匹配命令:unicode而不是__unicode__
我无法重现您的问题
使用stdlibEnum (3.4+) 或enum34向后移植(Python 2.x),您将不得不以困难的方式做到这一点——创建您自己的基Enum类:
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'
Run Code Online (Sandbox Code Playgroud)
并在使用中:
>>> fruit = Fruits.APPLE
>>> unicode(fruit)
u'Crunchy Apple'
Run Code Online (Sandbox Code Playgroud)
如果您可以使用1,您会更轻松:aenum library
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
Run Code Online (Sandbox Code Playgroud)
并在使用中:
fruit = Fruits.APPLE
fruit.describe()
Run Code Online (Sandbox Code Playgroud)
请注意,由于这unicode是 Python 3 中的默认名称,因此我将名称更改为describe.
1声明:我是Python stdlibEnum、enum34backport和Advanced Enumeration ( aenum)库的作者 。
| 归档时间: |
|
| 查看次数: |
2010 次 |
| 最近记录: |