列挙型ソースコード
上記の例から、列挙型クラスのすべてのメンバーが __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 と、メソッド __members__( cls) は @property を通じてアクセスされます __members__
を通じて直接アクセスできる変数形式に変更されました