【发布时间】:2017-12-31 20:36:30
【问题描述】:
我知道 Python 可以做枚举(很好),但它做的枚举类型非常原始。例如我可以这样做:
from enum import Enum
class Color(Enum):
BLACK = 'black'
WHITE = 'white'
print(Color.BLACK.value)
这很好,但是如果我希望每种颜色都有一个名称和一个十六进制值怎么办?我有几个选择(比如让枚举值成为字典),但我更喜欢 Java 做枚举的方式。在 Java 中,允许枚举像类一样具有字段和方法。所以通常当一种语言只支持像上面的例子这样简单的枚举时,我会像下面这样重构代码:
class Color(object):
BLACK = Color('black', '#000')
WHITE = Color('white', '#fff')
def __init__(self, name, hex):
self.name = name
self.hex = hex
print(Color.BLACK.name + ' ' + Color.BLACK.hex)
现在我可以有多个值、自定义方法,并且可以按名称引用不同的字段,因为每种颜色都是一个对象。我已经用几种语言毫无问题地做到了这一点,但 Python 似乎抱怨“名称'颜色'未定义”。我不能在该类中创建一个类的实例吗?我的 hacky 解决方案是这样做:
class Color(object):
def __init__(self, name, hex):
self.name = name
self.hex = hex
Color.BLACK = Color('black', '#000')
Color.WHITE = Color('white', '#fff')
print(Color.BLACK.name + ' ' + Color.BLACK.hex)
效果很好。不过,我的问题是,为什么类中不允许使用这些字段?我可以添加一些东西或对其进行重组以使其允许吗?提前感谢您的任何回答!
【问题讨论】:
-
那么 Python 必须构造一个
Color类,作为参数BLACK = Color('black', '#000')。但那时,Color尚未定义。所以这就像“鸡和蛋”的问题。