我有颜色的枚举。我希望将一个辅助方法“toRGB()”添加到枚举类中,该类将枚举的实例转换为RGB对象。作为优化,我希望将字典创建为静态变量。但是,正确的语法似乎让我望而却步。
有人能提出正确的方法吗?
from enum import Enum
class RGB:
def __init__(self, r, g, b):
pass
class Color(Enum):
RED = 0
GREEN = 1
__tbl = {
RED: RGB(1, 0, 0),
GREEN: RGB(0, 1, 0)
}
def toRGB(self):
return self.__class__.__tbl[self.value]
c = Color.RED
print(c.toRGB())
我收到以下错误:
Traceback (most recent call last):
File "C:/Users/user/Desktop/test.py", line 20, in <module>
print(c.toRGB())
File "C:/Users/user/Desktop/test.py", line 17, in toRGB
return self.__class__.__tbl[self.value]
TypeError: 'Color' object does not support indexing
答案 0 :(得分:4)
非方法属性成为枚举成员(甚至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)
}
答案 1 :(得分:0)
我们无法从您的示例中了解0
,1
,2
,......是有意义的值还是仅仅占位符,但如果它们只是位置持有者然后最好的解决方案是丢弃它们并直接使用RGB
值作为Enum
成员值:
class Color(Enum):
RED = 1, 0, 0
GREEN = 0, 1, 0
BLUE = 0, 0, 1
如果Enum
成员与value
值分开rgb
,您可以使用new aenum library并解决此问题:
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)
答案 2 :(得分:0)
从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