enum 类中调用的init方法在哪里?

Where is the init method invoked in enum classes?

我有一个 class 像下面的那个。

from enum import Enum, unique
from typing import Tuple

@unique
class Test(Enum):
    v1: Tuple = (1, "value_1")
    v2: Tuple = (2, "value_2")

    def __init__(self, value_number: int, value_name: str) -> None:
        self.value_number = value_number
        self.value_name = value_name

    @classmethod
    def get_value_name_by_value_number(cls, number: int) -> str:
        for member in cls.__members__.values():
            if member.value_number == number:
                return member.value_name
        else:
            raise NotImplementedError()

if __name__ == '__main__':
    name = Test.get_value_name_by_value_number(number=2)
    print(name)

当我运行代码时,输​​出是正确的。但是我不明白为什么它可以正常工作。据我所知, __init__ 方法是在创建实例时调用的。我调用的方法是 classmethod,因此我没有创建对象并直接从 class 调用它。所以 __init__ 没有被调用。但是我的 class 怎么知道 member.value_numbermember.value_name 是什么?

创建 Test class 时,Enum 内部将创建所有枚举成员和 manually call your __init__ method:

enum_member.__init__(*args)

您可能认为它只是在某个地方正常实例化您的 class,但随着 Enum 实现中发生了多少奇怪的魔法,事实证明这是行不通的。