你不能用enum
标准库模块。如果你尝试一下:
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
and int
使其枚举值are int
值,如中所述Others https://docs.python.org/3/library/enum.html#others文档的部分?
不,因为您要子类化什么类型?不是Enum
;那已经是你的类型了。你不能使用type
(任意类的类型)。没有什么有效的。
因此,您必须使用具有不同设计的不同 Enum 实现才能实现此目的。幸运的是,PyPI 和 ActiveState 上大约有 69105 个不同的可供选择。
例如,当我正在考虑构建类似于 Swift 枚举的东西(它比 Python/Java/等枚举更接近 ML ADT)时,有人建议我看看makeobj https://pypi.python.org/pypi/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 值,但除此之外它看起来就像你想要的一切。它还有一些其他很酷的功能(不完全是我想要的,但很有趣......)。