1. 源码分析
1.1 元类: EnumMeta
我们所有的枚举类都是由这个EnumMeta
元类创建出来的,这个类非常重要,其中有三个非常核心的魔法方法
。
__prepare__
:如果一个类指定元类为EnumMeta
,那么解释器在创建这个类之前,首先会调用元类的__prepare__
魔法方法,返回一个字典或者映射类型的对象作为这个类的命名空间。
看代码
from enum import Enum
class MyEnum(Enum):
print('======', locals())
a = 1
b = 2
c = 3
print('======', locals())
上面的代码运行起来之后,会打印如下的内容:
====== {‘generate_next_value’: <function Enum.generate_next_value at 0x10357dbf8>, ‘module’: ‘main’, ‘qualname’: ‘MyEnum’}
====== {‘generate_next_value’: <function Enum.generate_next_value at 0x10357dbf8>, ‘module’: ‘main’, ‘qualname’: ‘MyEnum’, ‘a’: 1, ‘b’: 2, ‘c’: 3}
__prepare__
魔法方法返回的是一个enum
模块自定义的类_EnumDict
的对象,这个类是字典的子类,重写了字典的__setitem__
方法