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

时间:2019-04-25 14:24:17

标签: python class enums constructor python-3.4

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

from enum import Enum

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

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

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

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

classes = [TestEnum(), TestNotEnum()]

TestNotEnum类没有问题,但是TestEnum引发以下异常:TypeError: __call__() missing 1 required positional argument: 'value'。这是由于我对Enum的不良使用。

要使TestEnum类仍继承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

这样的错误

3 个答案:

答案 0 :(得分:1)

您可以选择的一种方法是使工厂函数的名称像枚举一样:

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>]

答案 1 :(得分:0)

由于python内置的enum类无法做到这一点,因此可能的解决方法是使用高级enum包。只需将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()]

答案 2 :(得分:0)

感谢@glibdud对我的问题进行了评论=>如显示here所示,不可能:所有Enum类都是Singletons,因此我无法按自己的方式调用该构造。

其他给定的解决方案很有趣,但不能满足我的需求(aenum增加了新的约束,工厂函数为API用户增加了新的复杂性)

另一种可能是制作自己的Enum类以满足我的需要,但我选择重做自己的体系结构,因为它速度更快:我没有放置类实例classes = [TestEnum(), TestNotEnum()],而是放置了引用{ {1}}作为模板数组,期望的值放在相同大小的第二个数组中。

不如我所希望的解决方案好,但它可以工作,并且允许API用户执行最少的工作,因为他不编辑模板数组。