是否可以调用不带参数继承 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 用户做最少的工作,因为他不编辑模板数组。
我有多个 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 用户做最少的工作,因为他不编辑模板数组。