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