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_number
和 member.value_name
是什么?
创建 Test
class 时,Enum
内部将创建所有枚举成员和 manually call your __init__
method:
enum_member.__init__(*args)
您可能认为它只是在某个地方正常实例化您的 class,但随着 Enum
实现中发生了多少奇怪的魔法,事实证明这是行不通的。
我有一个 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_number
和 member.value_name
是什么?
创建 Test
class 时,Enum
内部将创建所有枚举成员和 manually call your __init__
method:
enum_member.__init__(*args)
您可能认为它只是在某个地方正常实例化您的 class,但随着 Enum
实现中发生了多少奇怪的魔法,事实证明这是行不通的。