通過上面的實(shí)例可以知道通過 __members__ 可以遍歷枚舉類的所有成員。那為什么呢?
我們可以先來大致看看 Enum 的源碼是如何實(shí)現(xiàn)的;Enum 在模塊 enum.py 中,先來看看 Enum 類的片段
class Enum(metaclass=EnumMeta):
"""Generic enumeration.
Derive from this class to define new enumerations.
"""
可以看到,Enum 是繼承元類 EnumMeta 的;再看看 EnumMeta 的相關(guān)片段
class EnumMeta(type):
"""Metaclass for Enum"""
@property
def __members__(cls):
"""Returns a mapping of member name->value.
This mapping lists all enum members, including aliases. Note that this
is a read-only view of the internal mapping.
"""
return MappingProxyType(cls._member_map_)
首先 __members__ 方法返回的是一個(gè)包含一個(gè) Dict 既 Map 的 MappingProxyType,并且通過 @property 將方法 __members__(cls) 的訪問方式改變?yōu)榱俗兞康牡男问剑瓤梢灾苯油ㄟ^ __members__ 來進(jìn)行訪問了