是否可以调用不带参数继承 Enum 的 class 的构造函数?

Is it possible to call the constructor of a class that inherits Enum without arguments?

我有多个 classes,一些继承了 Enum,另一些则没有,它们最终都混合在大数组中,如下所示:

from enum import Enum

class TestEnum(Enum):
    VAL_A = 0
    VAL_B = 1

class TestNotEnum():
    def __init__(self):
        self.var = 1

因为我希望有一个尽可能简单的代码供其他人使用,所以我想以相同的方式调用所有 classes 的构造函数,以避免尽可能多的混淆。

这就是我想要初始化它们的方式:

classes = [TestEnum(), TestNotEnum()]

TestNotEnum class 没有问题,但 TestEnum 抛出以下异常:TypeError: __call__() missing 1 required positional argument: 'value'。这是由于我(错误地)使用了枚举。

我该怎么做才能让 TestEnum class 仍然继承 Enum 并且拥有一个没有参数的构造函数?

我尝试了以下(以及一些类似的调整):

class TestEnum(Enum):
    VAL_A = 0
    VAL_B = 1
    def __init__(self):
        super(TestEnum, self).__init__()

但我最终只会遇到不同的错误,例如 TypeError: __init__() takes 1 positional argument but 2 were given

你有一个选择是让工厂函数像你的枚举一样命名:

from enum import Enum

class TestEnum(Enum):
    VAL_A = 0
    VAL_B = 1

def TestEnum1():
    return TestEnum

class TestNotEnum():
    def __init__(self):
        self.var = 1


instances = [TestEnum1(), TestNotEnum()]
print(instances)

输出:

[<enum 'TestEnum'>, <__main__.TestNotEnum object at 0x03648E30>]

鉴于 python 的内置枚举 class 无法做到这一点,一个潜在的解决方法是使用高级枚举包。只需将 from enum import Enum 替换为 from aenum import enum as Enum,您现有的代码就可以正常工作。

from aenum import enum as Enum
class TestEnum(Enum):
    VAL_A = 0
    VAL_B = 1
    def __init__(self):
        super(TestEnum, self).__init__()
class TestNotEnum():
    def __init__(self):
        self.var = 1
classes = [TestEnum(), TestNotEnum()]

感谢 @glibdud who commented my question => it is not possible as show here:所有枚举 class 都是单例,因此我无法按照我希望的方式调用构造。

其他给定的解决方案很有趣,但不符合我的需要(aenum 添加了新的约束,工厂函数为 API 用户添加了新的复杂层)

另一种可能性是制作我自己的枚举 class 来满足我的需要,但我选择重做我的架构,因为它更快:而不是这样放置 class 个实例 classes = [TestEnum(), TestNotEnum()],我将引用 classes = [TestEnum, TestNotEnum] 作为模板数组,将期望值放在第二个相同大小的数组中。

不如我想要的解决方案好,但它有效并且允许 API 用户做最少的工作,因为他不编辑模板数组。