我有多个类,有些继承了Enum,有些没有,并且所有这些类最终混合在大数组中,如下面的show:
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
等不同的错误
您可以选择将工厂函数命名为枚举:
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的内置枚举类是不可能的,但潜在的解决方法是使用高级枚举包。只需用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评论我的问题=>它不可能像展示here:所有枚举类都是单身人士,因此我不能按照我希望的方式调用构造。
其他给定的解决方案很有意思,但不符合我的需求(aenum增加了新的约束,工厂函数为API用户增加了一层新的复杂性)
另一种可能性就是让我自己的Enum类符合我的需要,但我选择重做我的架构,因为它更快:不是以这种方式放置类实例classes = [TestEnum(), TestNotEnum()]
,我将引用classes = [TestEnum, TestNotEnum]
作为模板数组并且希望第二个相同大小的数组中的值。
不如我想要的解决方案那么好但是它可以工作并且允许API用户做最小的工作,因为他不编辑模板数组。