您无法使用enum
stdlib模块执行此操作。如果您尝试:
class A(Enum):
class B(Enum):
a = 1
b = 2
class C(Enum):
c = 1
d = 2
A.B.a
…您将得到一个类似的异常:
AttributeError: 'A' object has no attribute 'a'
这是因为的枚举值的A
行为类似于的实例A
,而不是其值类型的实例。就像持有int
值的普通枚举在值上没有int
方法一样,B
不会有Enum
方法。比较:
class D(Enum):
a = 1
b = 2
D.a.bit_length()
当然,您可以显式访问基础值(int
或B
类):
D.a.value.bit_length()
A.B.value.a
…但是我怀疑那是您想要的。
所以,你可以用同样的伎俩,IntEnum
用途,既继承的Enum
,并int
使得其枚举值 的int
值,如所描述的其他的文档的部分?
不,因为您将继承哪种类型?不Enum
; 那已经是你的类型了。您不能使用type
(任意类的类型)。没有任何工作。
因此,您必须使用具有不同设计的其他Enum实现来完成此工作。幸运的是,PyPI和ActiveState上大约有69105个不同的选项可供选择。
例如,当我要构建类似于Swift枚举的东西(比Python / Java / etc。枚举更接近ML ADT)时,有人建议我看一下makeobj
。我忘记这样做了,但是现在我只是这样做了,并且:
class A(makeobj.Obj):
class B(makeobj.Obj):
a, b = makeobj.keys(2)
class C(makeobj.Obj):
c, d = makeobj.keys(2)
print(A.B, A.B.b, A.B.b.name, A.B.b.value)
这给您:
<Object: B -> [a:0, b:1]> <Value: B.b = 1> b 1
如果查看它__qualname__
而不是查看它__name__
来创建str / repr值,那可能会很好,但是否则看起来它就可以满足您的所有要求。而且它还有其他一些很酷的功能(不完全是我想要的,但是很有趣……)。