faf*_*aro 4 python enums python-3.x
我有一个颜色的枚举。我希望在枚举类中添加一个辅助方法“ 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())
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
vdb*_*oor 16
从 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
Run Code Online (Sandbox Code Playgroud)
非方法属性成为枚举成员(甚至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]
Run Code Online (Sandbox Code Playgroud)
另外,您可以在创建类后定义属性:
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)
}
Run Code Online (Sandbox Code Playgroud)