您无法使用
enumstdlib模块执行此操作。如果您尝试:
class A(Enum): class B(Enum): a = 1 b = 2 class C(Enum): c = 1 d = 2A.B.a
…您将得到一个类似的异常:
AttributeError: 'A' object has no attribute 'a'
这是因为的枚举值的
A行为类似于的实例
A,而不是其值类型的实例。就像持有
int值的普通枚举在值上没有
int方法一样,
B不会有
Enum方法。比较:
class D(Enum): a = 1 b = 2D.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值,那可能会很好,但是否则看起来它就可以满足您的所有要求。而且它还有其他一些很酷的功能(不完全是我想要的,但是很有趣……)。



