enum class 定义过程

enum class definition process

我正在阅读枚举源代码,所以

class Enum(metaclass=EnumMeta)

在 EnumMeta 中有一个 __call____new__ 方法,在 Enum 中有一个 __new__ ,我的问题是当我们实例化一个 Enum class 时,为什么 __call__ 元 class 被调用,而不是枚举的 __new__?

任何 class 中的 __new__ 用于创建该 class 的实例。所以:

class Buffer:
    def __new__(cls, size):
        instance = object.__new__(cls)
        instance.storage = bytearray(size)
        return instance

并且在 REPL 中:

>>>> buffer = Buffer(32)
>>> buffer
<__main__.Buffer object at 0x7fb146867a60>

>>> type(buffer)
<class '__main__.Buffer'>

那么,如果 Buffer.__new__ 用于创建 Buffer 的实例,那么 Buffer 本身是什么实例?

>>> type(Buffer)
<class 'type'>

好吧,Buffertype 的实例——因此,就像 Buffer.__new__ 用于创建 Buffer 的实例一样,type.__new__用于创建 type 的实例,Buffer

将其转回 EnumEnumMetaEnumMeta.__new__ 用于创建其自身的实例,即 Enum classes 和 Enum.__new__用于创建 Enum 实例,这是它的成员。

Enum 的部分魔力,也可能是部分混乱,成员 是 class 的 个实例,即使它们列在枚举 class 的正文中(通常这些东西只是属性,如上面 Buffer 中使用的 storage)。