python 3.7,使用
_ignore_
字段:https://docs.python.org/3/library/enum.html
class Color(Enum):
_ignore_ = ['_tbl']
_tbl = {} # nice for the type checker, but entirely ignored!
Color._tbl = {} # actually creates the attribute
tbl
)。您可以使用关键字参数:
class Color(Enum):
RED = 0
GREEN = 1
def toRGB(self, tbl={
RED: RGB(1, 0, 0),
GREEN: RGB(0, 1, 0)
}):
return tbl[self.value]
,您可以在类创建后定义属性:class Color(Enum):
RED = 0
GREEN = 1
def toRGB(self):
return self._tbl[self]
Color._tbl = {
Color.RED: RGB(1, 0, 0),
Color.GREEN: RGB(0, 1, 0)
}
我们无法从您的示例中分辨出
0
,1
,2
RGB
值直接用作class Color(Enum):
RED = 1, 0, 0
GREEN = 0, 1, 0
BLUE = 0, 0, 1
Enum
如果成员与他们的
value
值分开,则可以使用newaenum库并解决这样的问题:
rgb
使用:
from aenum import Enum, NamedTuple
RGB = NamedTuple('RGB', 'r g b')
class Color(Enum, init='value rgb'):
RED = 1, RGB(1,0,0)
GREEN = 2, RGB(0,1,0)
BLUE = 3, RGB(0,0,1)
如果您想要的是类型转换,则可以将
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.rgb
RGB(r=1, g=0, b=0)
类用作枚举值:
RGB
您还可以跳过from enum import Enum
class RGB:
def __init__(self, r, g, b):
# Check your inputs
self.r = r
self.g = g
self.b = b
def __str__(self):
return f"{self.r} {self.g} {self.b}"
class Color(Enum):
RED = RGB(1, 0, 0)
GREEN = RGB(0, 1, 0)
def toRGB():
return c.value
c = Color.RED
print(c.toRGB())
助手方法,然后简单地写toRGB
Color.RED.value
注意,您不能使用诸如
Enum
,class Color(str, Enum):
RED = "red"
GREEN = "green"
def __new__(cls, value):
if not hasattr(cls, "instance"):
cls.__tbl = {"red": RGB(1, 0, 0), "green": RGB(0, 1, 0)}
obj = str.__new__(cls, value)
return Enum.__new__(cls, obj)
等的枚举实例(它们尚不存在),因此我改用字符串标识符。我通常更喜欢第一个解决方案。我的代码看起来像这样,因为它需要精确加载一个大数据集。
现在,您的代码完全很好,并且可以做您想要的。这是因为在定义枚举值时忽略了以双重下划线开头的名称。
当您不想以双重下划线开始您的名字时,是:
将您属性的值分配在
RED
中。使用
GREEN
属性将属性声明为被忽略(请注意,类型的Checker通常在编写时不支持此用法)。将枚举类别的属性放置而不是成员。