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'>
好吧,Buffer
是 type
的实例——因此,就像 Buffer.__new__
用于创建 Buffer
的实例一样,type.__new__
用于创建 type
的实例,Buffer
是
将其转回 Enum
和 EnumMeta
:EnumMeta.__new__
用于创建其自身的实例,即 Enum classes 和 Enum.__new__
用于创建 Enum 实例,这是它的成员。
Enum
的部分魔力,也可能是部分混乱,成员 是 class 的 个实例,即使它们列在枚举 class 的正文中(通常这些东西只是属性,如上面 Buffer
中使用的 storage
)。
我正在阅读枚举源代码,所以
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'>
好吧,Buffer
是 type
的实例——因此,就像 Buffer.__new__
用于创建 Buffer
的实例一样,type.__new__
用于创建 type
的实例,Buffer
是
将其转回 Enum
和 EnumMeta
:EnumMeta.__new__
用于创建其自身的实例,即 Enum classes 和 Enum.__new__
用于创建 Enum 实例,这是它的成员。
Enum
的部分魔力,也可能是部分混乱,成员 是 class 的 个实例,即使它们列在枚举 class 的正文中(通常这些东西只是属性,如上面 Buffer
中使用的 storage
)。