我正在try 编写一个同时包含其定义的对象的行为和静态实例的类,在执行此操作时,我try 使用dataclass(frozen=True)enum.

@dataclass(frozen=True)
class Foo(Enum):
    a: int
    b: float

    FOO1 = Foo(1, 1.0)
    FOO2 = Foo(2, 0.5)

这种方法的一个明显复杂之处在于,您不能根据类本身定义类级变量,因此我不得不使用以下内容:


@dataclass(frozen=True)
class _Foo:
    a: int
    b: float


class Foo(Enum):
    FOO1 = _Foo(1, 1.0)
    FOO2 = _Foo(2, 0.5)

但是,这样做会导致类型提示问题,因为代码认为FOO1FOO2Foos的实例,而不是Foo的实例.所以好的,这可能是一个简单的解决办法,所以我说:


@dataclass(frozen=True)
class _Foo:
    a: int
    b: float


@dataclass(frozen=True)
class Foo(_Foo, Enum):
    FOO1 = _Foo(1, 1.0)
    FOO2 = _Foo(2, 0.5)

这现在会导致程序错误地显示TypeError: _value_ not set in __new__, unable to create it,而我现在不知所措.有没有一种方法可以有效地混合数据类和枚举,或者有没有更好的方法?

推荐答案

我不知道这是否适合打字(请发表 comments 让我知道),但是,从Python3.11开始,Enum使用以下模式进行了优化,可以与dataclass一起使用:

@dataclass(frozen=True)
class Foo:
    a: int
    b: float

class FooEnum(Foo, Enum):
    FOO1 = 1, 1.0
    FOO2 = 2, 0.5

在使用中:

>>> FooEnum.FOO1
<FooEnum.FOO1: a=1, b=1.0>

>>> FooEnum.FOO1.value
Foo(a=1, b=1.0)

Python-3.x相关问答推荐

如何在Django中创建两个不同权限的用户?

使用魔方无法从图像中识别单个字符

PythonPandas 创建一个列并添加到DataFrame

为什么在Python中使用RANDINT函数时会出现此TypeError?

为什么我的Selenium脚本在密码元素上失败?

根据第一个字典的值序列对第二个字典进行排序

tkinter treeview 如何在获取所选项目时将设置的对象作为对象返回

错误:无法为 pyconcorde 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

Python webdrivermanager 和 Chrome 115.0 的 URL https://chromedriver.storage.googleapis.com/LATEST_RELEASE_115.0.5790 错误没有此类驱动程序

GEKKO 在没有不等式的模型中抛出不等式定义错误

嵌套协议的使用(协议成员也是协议)

UnicodeDecodeError:utf-8编解码器无法解码位置 1 的字节 0x8b:无效的起始字节,同时读取Pandas中的 csv 文件

如何从另一个目录导入 python 包?

if 语句中冒号的语法错误

发送Electron邮件时的 MIMEText UTF-8 编码问题

如何将numpy数组图像转换为字节?

python 3的蓝牙库

如何在 python 3.x 中禁用 ssl 判断?

如何避免使用我的 python 包构建 C 库?

在 Keras 中训练神经网络的零精度