Enum 的源碼
透過上面的實例可以知道透過 __members__ 可以遍歷枚舉類別的所有成員。那為什麼呢?
我們可以先來大致看看Enum 的源碼是如何實現的;Enum 在模組enum.py 中,先來看看Enum 類別的片段
class Enum(metaclass=EnumMeta): """Generic enumeration. Derive from this class to define new enumerations. """
可以看到,Enum 是繼承元類別EnumMeta 的;再看看EnumMeta 的相關片段
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__ 方法傳回的是一個包含一個Dict 既Map 的MappingProxyType,並且透過@property 將方法__members__(cls) 的存取方式改變為了變數的形式,既可以直接透過__members__ 來進行訪問了