覆盖扩展 Enum 的类的 __new__

问题描述 投票:0回答:1

Message
扩展
Enum
以添加一些逻辑。两个重要参数是详细级别和消息字符串,以及其他可选消息 (
*args
)。另一个类
MessageError
Message
类的一种特殊形式,其中详细级别始终为零,其他一切都相同。

下面的代码尖叫

TypeError

TypeError: Enum.new() takes 2 positional arguments but 3 were given

from enum import Enum


class Message(Enum):
    verbose: int
    messages: list[str]

    def __new__(cls, verbose: int, message: str, *args):
        self = object.__new__(cls)
        self._value_ = message
        return self
    
    def __init__(self, verbose: int, message: str, *args):
        self.verbose = verbose
        self.messages = [self.value] + list(args)


class MessageError(Message):

    def __new__(cls, message: str):
        return super().__new__(cls, 0, message) # <- problem is here!

    def __init__(self, message: str):
        return super().__init__(0, message)


class Info(Message):
    I_001 = 2, 'This is an info'


class Error(MessageError):
    E_001 = 'This is an error'

我原以为

super().__new__(cls, 0, message)
会从
__new__
班级打电话给
Message
,但似乎并非如此。我在这里做错了什么?

python enums overriding typeerror new-operator
1个回答
0
投票

Enum
在几个方面是不寻常的(又名怪异的),创造是最大的领域。在枚举类创建过程中,在成员本身创建之后但在类返回之前,任何现有的
__new__
被重命名为
_new_member_
并且来自
__new__
本身的
Enum
被插入到类中——就是这样
Info('This is an error')
之类的调用将返回现有成员(或加薪),而不是创建新成员。

你的

MessageError.__new__
应该看起来像:

    def __new__(cls, message: str):
        return super()._new_member_(cls, 0, message)

披露:我是 Python stdlib

Enum
enum34
backport
Advanced Enumeration (
aenum
)
库的作者。

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