我正在尝试将IntEnum子类化,以从某个值开始成员的值,然后自动为后续成员设置值。这是我的课:
class Abc(IntEnum):
def __init__(self, n=100):
super().__init__()
self._value_ = n + len(self.__class__.__members__)
A = () # 100
B = () # 101
Abc.A == Abc.B # expects False, but gets True
如上所示,成员之间的比较是不正确的。当打印出Abc.dict时,我注意到它的值member_map_也不正确。在
^{pr2}$请注意,''u value2member_map_u'的键是0,而不是预期的值100和101。我一定是在init函数中遗漏了一些东西,但我无法确定如何正确地执行我的意图。感谢任何帮助。 非常感谢。在
首先,有一种更惯用、更简单的方法来做你想做的事情:
或者,考虑到您将100和101作为注释放入,实时代码总是比注释好:
^{pr2}$事实上,你没有做这两件事中的任何一件,都是在向读者发出一个信号:你可能在做一些更复杂的事情。不过,据我所知,你不是,所以这是误导。在
另外,您组合了两个具有直接相反含义的模式:例如,the docs例如,使用
()
习惯用法“向用户表示这些值不重要”,但是使用IntEnum
显然意味着这些枚举常量的数值不仅重要,而且是它们的全部要点。在不仅如此,用户还必须通读你的方法代码,以找出那些重要的数值是什么,而不是直接读取它们。在
不管怎样,如果您想让它正常工作,问题是在初始化之后替换
_value_
并没有被记录为有任何好处,事实上也没有您要重写的是},如the auto-numbering example in the docs。在
__new__
,而不是{但是这里有两个区别(两者都与使用}有关):
IntEnum
而不是{object.__new__
,因为IntEnum
是int
,并且{int
这样的内置类型的实例。您可以通过查看cls
的mro动态地找出正确的基类,或者您可以在这里对int
进行硬编码。在IntEnum
s,您可能仍然需要一个。)所以:
^{3}$相关问题 更多 >
编程相关推荐