如何重写枚举构造函数?

Sal*_*dar 4 python enums constructor overriding python-3.x

我想创建一个存储二进制值的枚举,但我可以向其传递任何值(它将存储value % 2)。

\n\n

也就是说:我想使用EnumPython3 中的“官方”类型,但更改构造函数。

\n\n

我尝试了这段代码:\xc2\xa0

\n\n
from enum import Enum\n\nclass Color(Enum):\n    black = 0\n    red = 1\n\n    def __new__(cls, value):\n        super().__new__(cls, value % 2)\n\n    def __str__(self):\n        return self.name\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到一个错误:

\n\n
>>> from ZCasino import *\nValueError: 0 is not a valid Couleur\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\n  File "/home/felix/T\xc3\xa9l\xc3\xa9chargements/ZCasino.py", line 12, in <module>\n    class Couleur(Enum):\n  File "/usr/lib/python3.8/enum.py", line 212, in __new__\n    enum_member = __new__(enum_class, *args)\n  File "/home/felix/T\xc3\xa9l\xc3\xa9chargements/ZCasino.py", line 18, in __new__\n    super().__new__(cls, value)\n  File "/usr/lib/python3.8/enum.py", line 595, in __new__\n    raise exc\n  File "/usr/lib/python3.8/enum.py", line 579, in __new__\n    result = cls._missing_(value)\n  File "/usr/lib/python3.8/enum.py", line 608, in _missing_\n    raise ValueError("%r is not a valid %s" % (value, cls.__name__))\nValueError: 0 is not a valid Couleur\n
Run Code Online (Sandbox Code Playgroud)\n

Eth*_*man 15

您可以利用新_missing_方法:

from aenum import Enum

class Color(Enum):
    black = 0
    red = 1
    #
    def __str__(self):
        return self.name
    #
    @classmethod
    def _missing_(cls, value):
        return cls(value % 2)
Run Code Online (Sandbox Code Playgroud)

并在使用中:

>>> list(Color)
[<Color.black: 0>, <Color.red: 1>]

>>> Color(3)
<Color.red: 1>

>>> Color(8)
<Color.black: 0>
Run Code Online (Sandbox Code Playgroud)

_missing_在 Python 3.6 中引入。如果您需要支持早期的 Python,您可以使用1库。aenum

注意:当调用时,Color(7)您不是创建一个新的,而是获取创建 Enum 本身时创建的Color现有的。<Color.black: 0>


1声明:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum)库的作者 。