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

问题描述 投票:2回答:2

我有多个类,有些继承了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等不同的错误

python class enums constructor python-3.4
2个回答
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>]

0
投票

虽然使用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()]

0
投票

感谢@glibdud评论我的问题=>它不可能像展示here:所有枚举类都是单身人士,因此我不能按照我希望的方式调用构造。

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

另一种可能性就是让我自己的Enum类符合我的需要,但我选择重做我的架构,因为它更快:不是以这种方式放置类实例classes = [TestEnum(), TestNotEnum()],我将引用classes = [TestEnum, TestNotEnum]作为模板数组并且希望第二个相同大小的数组中的值。

不如我想要的解决方案那么好但是它可以工作并且允许API用户做最小的工作,因为他不编辑模板数组。

© www.soinside.com 2019 - 2024. All rights reserved.