我目前正在使用以下类型的枚举:
class System(Enum):
FIRST = 1
SECOND = 2
现在我希望能够做到以下几点:
a = System.FIRST
url = a.getSystemURL()
其中枚举成员FIRST
和SECOND
的网址当然不同。
我可以创建一个字典,其中枚举成员作为键,url作为值,但这不能保证如果我以后添加枚举成员,我将记得添加相应的字典条目。< / p>
是否有一种干净的方法来为枚举成员提供具有多个值的枚举?并列举这些不同的价值观?
这样的事情:
class System(Enum):
Values = (Value, url, something)
FIRST = 1, 'https://www.example.com', 42
SECOND = 2, 'https://www.test.com', 13
答案 0 :(得分:4)
文档中有an example这样的内容。如果类定义了__init__
方法,则枚举值将作为参数传递给它。这意味着您可以像这样定义枚举:
class System(Enum):
FIRST = 1, 'https://www.example.com', 42
SECOND = 2, 'https://www.test.com', 13
def __init__(self, value, url, something):
self.value_ = value
self.url = url
self.something = something
(请注意value
是枚举保留的特殊属性,因此我将属性value_
命名为避免名称冲突。)
您现在可以在每个枚举成员上访问这些属性:
>>> System.FIRST.url
'https://www.example.com'
答案 1 :(得分:1)
stdlib Enum
和aenum
1 都可以轻松支持您的用例(尽管stdlib版本需要更多工作)。
stdlib enum
3.4+(请参阅__new__
和__init__
解释的文档。)
import enum
class System(enum.Enum):
def __new__(cls, *args, **kwds):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, url, something):
self.url = url
self.something = something
FIRST = 'https://www.example.com', 42
SECOND = 'https://www.test.com', 13
aenum
- 适用于Python 2和3代码。 aenum
也使一些事情变得更容易 - 上面的代码将是:
import aenum
class System(aenum.AutoNumberEnum):
_init_ = 'url something'
FIRST = 'https://www.example.com', 42
SECOND = 'https://www.test.com', 13
并在使用中:
--> System.FIRST
<System.First: 1>
--> System.FIRST.url
'https://www.example.com'
1 披露:我是Python stdlib Enum
,enum34
backport和Advanced Enumeration (aenum
)图书馆的作者。
答案 2 :(得分:0)
将值设为namedtuple
。
from collections import namedtuple
from enum import Enum
Entry = namedtuple('Entry', ['value', 'url', 'something'])
class System(Enum):
FIRST = Entry(1, 'https://www.example.com', 42)
SECOND = Entry(2, 'https://www.test.com', 13)
print(System.FIRST.value.url)
# https://www.example.com
答案 3 :(得分:0)
您是否尝试过编写的代码?它已经正常工作!当然你没有真的有多个值,你有一个元组值 - 但这不是问题:
>>> class System(Enum):
... FIRST = 1, 'https://www.example.com', 42
... SECOND = 2, 'https://www.test.com', 13
>>> _, url, _ = System.SECOND.value
>>> url
'https://www.example.com'
>>> a = System.FIRST
>>> url = a.value[1]
>>> url
'https://www.example.com'
您可以采取一些措施来改善这一点,例如使用namedtuple
代替普通tuple
,这样您就可以写a.value.url
代替a.value[1]
,但是你已经写了一些有效的东西。