如何更新Python枚举中的name属性?

问题描述 投票:0回答:2

在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"
python enums
2个回答
3
投票

在深入研究

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"

会成功的


0
投票

根据@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
© www.soinside.com 2019 - 2024. All rights reserved.