我有多个类,一些继承了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
答案 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用户执行最少的工作,因为他不编辑模板数组。