我想利用Python的enum在自己的命名空间中创建价值。
这是基本的想法:
from enum import Enum
class MyBaseNs(Enum):
__namespace__ = 'base'
a = 'a'
b = 'b'
class MyChildNs(MyBaseNs):
__namespace__ = 'child'
a = 'a'
b = 'b'
然后每个成员应打印以下内容:
>>> MyBaseNs.a.value
'base.a'
>>> MyBaseNs.b.value
'base.b'
>>> MyChildNs.a.value
'base.child.a'
>>> MyChildNs.a.value
'base.child.b'
理想情况下,我希望直接从会员名称中取值,这样我就可以避免重复,就像给出一个例子的Autoumber class一样。
奖金将是能够做类似的事情:
>>> MyBaseNs.child.a.value
'base.child.a'
我开始使用__new__()
方法,但很难达到预期效果。
现在我有以下内容:
from enum import Enum
class MyNs(str, Enum):
__sep__ = '.'
def __new__(cls, value):
obj = str.__new__(cls)
obj._value_ = cls.__sep__.join(cls.__namespace__ + (str(value), ))
return obj
class A(MyNs):
__namespace__ = ('a', )
a = 'a'
因此,这会使str
专门Enum
并将__namespace__
元组加入每个成员值。所以这是我正在寻找的基础知识。
解决方案意味着要遍历当前命名空间的所有父节点以创建最终的__namespace__
元组。我现在不知道如何做到这一点。
如何实现这样的行为? Enum
真的是最好的方式吗?
答案 0 :(得分:0)
我不确定你想要完成什么,这就是原因:
在你尝试的方式中使用Enum
的一个(大)难点是Enum
一旦成员存在就不允许继承子类;换句话说,一旦您将MyBaseNs
创建为Enum
,就不允许您将MyChildNs
创建为Enum
。
至于你的代码;跑步的时候我明白了:
>>> A
<enum 'A'>
>>> A.a
<A.a: 'a.a'>
这似乎正是你所要求的。