在Python中做基本的
Enum
时:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
Color.RED.name # "RED"
name
属性可以获取项目的字符串表示形式,它正是属性的字符串名称:RED => "RED"
有没有办法用例如字典或工厂来更新此规则,以便具有例如:
Color.RED.name # "my color is RED"
在深入研究
Enum
的源代码后,我发现 name
属性确实是 @DynamicClassAttribute
,所以这样做:
from types import DynamicClassAttribute
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
@DynamicClassAttribute
def name(self):
name = super(Color, self).name
return f"my name is {name}"
Color.RED.name # "my name is RED"
会成功的
根据@clementwalter的回答,使用元组和模板设置
Enum
name
属性的技巧:
from enum import Enum
from types import DynamicClassAttribute
class Color(Enum):
RED = (1, '[RED]')
GREEN = 2
BLUE = 3
def __new__(cls, value, display_name=None):
obj = object.__new__(cls)
obj._value_ = value
obj.display_name = display_name
return obj
@DynamicClassAttribute
def name(self):
name = self.display_name or self._name_ # set a name with a tuple
name_apply_template = f"my color is {name}" # set all names with a template
return name_apply_template
print(f"{Color.RED}, {Color.RED.value}, {Color.RED._name_}, {Color.RED.display_name}, {Color.RED.name}")
print(f"{Color.GREEN}, {Color.GREEN.value}, {Color.GREEN._name_}, {Color.GREEN.display_name}, {Color.GREEN.name}")
# # Results:
# Color.RED, 1, RED, [RED], my color is [RED]
# Color.GREEN, 2, GREEN, None, my color is GREEN