您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中的枚举枚举?

Python中的枚举枚举?

您无法使用enumstdlib模块执行此操作。如果您尝试:

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()

当然,您可以显式访问基础值(intB类):

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值,那可能会很好,但是否则看起来它就可以满足您的所有要求。而且它还有其他一些很酷的功能(不完全是我想要的,但是很有趣……)。

python 2022/1/1 18:43:50 有315人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶