Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向枚举添加属性_Python_Python 3.x_Enums_Properties - Fatal编程技术网

Python 向枚举添加属性

Python 向枚举添加属性,python,python-3.x,enums,properties,Python,Python 3.x,Enums,Properties,我想为每个枚举值创建一个具有内部属性的Enum,此属性不能由用户设置或初始化,但一旦用户从一个值创建了Enum,他就可以根据该值读取(获取)此内部属性 e、 g 问题是,当前为了创建此类的实例,我需要: x=Channels((1,True))这很糟糕。我希望仍然能够创建这样的实例:x=Channels(1)(即True是1的内部属性,用户不应该指定) 我的第二次尝试是: class Channels2(Enum): @DynamicClassAttribute def int

我想为每个枚举值创建一个具有内部属性的
Enum
,此属性不能由用户设置或初始化,但一旦用户从一个值创建了
Enum
,他就可以根据该值读取(获取)此内部属性

e、 g

问题是,当前为了创建此类的实例,我需要:
x=Channels((1,True))
这很糟糕。我希望仍然能够创建这样的实例:
x=Channels(1)
(即
True
是1的内部属性,用户不应该指定)

我的第二次尝试是:

class Channels2(Enum):

    @DynamicClassAttribute
    def internal_property(self):
        if self.value == 1:
            return True
        elif self.value == 2:
            return True
        elif self.value == 3:
            return False


    Email     = 1
    Sms       = 2
    Log       = 3
这似乎正在工作(
x=Channels(1)
正在工作,并且
x.internal_属性
应该返回
True

这里的问题是,每次访问
internal\u属性
时都执行那些if语句,感觉效率不高。。是否有其他方法使
枚举
内部属性
视为实例的一个额外字段(在
枚举
常规
名称
字段之上)?

您可以使用
\uu新属性()
自定义枚举对象的值。例如,您可以使用原始定义,如:

from enum import Enum

class Channels(Enum):

    def __new__(cls, value, internal_property):
        obj = object.__new__(cls)
        obj._value_ = value
        obj.internal_property = internal_property
        return obj

    email = 1, True
    sms   = 2, True
    log   = 3, False

print(Channels.email)
# Coordinate.email

print(Channels.email.value)
# 1

print(Channels(3))
# Coordinate.log

print(Channels(3).internal_property)
# False

print(Channels(1).internal_property)
#True

@MarkMeyer提供了
stdlib
解决方案,但如果您正在寻找创建
Enum
s的更简单方法,则应尝试1:

在使用中:

>>> list(Channels)
[<Channels.email: 1>, <Channels.sms: 2>, <Channels.log: 3>]

>>> Channels(2)
<Channels.sms: 2>

>>> Channels(2).name
'sms'

>>> Channels(2).internal_property
True
>列表(频道)
[, ]
>>>频道(2)
>>>频道(2).名称
“短信”
>>>通道(2).内部_属性
符合事实的


1披露:我是、和图书馆的作者。

看起来不错!您不需要从
int
继承,只需执行
obj=object.\uuuu new\uuuu(cls)
谢谢@EthanFurman--我更新了答案
aenum
看起来很棒!
from aenum import Enum

class Channels(Enum):
    #
    _init_ = 'value internal_property'
    #
    email = 1, True
    sms   = 2, True
    log   = 3, False
>>> list(Channels)
[<Channels.email: 1>, <Channels.sms: 2>, <Channels.log: 3>]

>>> Channels(2)
<Channels.sms: 2>

>>> Channels(2).name
'sms'

>>> Channels(2).internal_property
True