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__ 來進行訪問了

繼續學習