enum.EnumTypeの実装
class EnumType(type):
typeを継承=メタクラス
定義した列挙型クラスの__members__はメタクラスEnumTypeが持っている
Returns a mapping of member name->value.
クラスの_member_map_属性を返す
_member_map_はどうできるのか?
EnumTypeの__new__
an Enum class is final once enumeration items have been defined
(Enumの定義で呼ばれるという理解でいいのかな)
要は、EnumTypeの親クラスtypeの__new__を呼び、その返り値を返す
enum_class = super().__new__(metacls, cls, bases, classdict, **kwds)
return enum_class
classdictは_member_map_を空の辞書で初期化
member_namesの1つ1つについてを作っている
member_names = classdict._member_names (L512)
TODO:もしかしてclassdictの初期値に__prepare__が関係している?
_member_map_の使われ方
__setattr__
Block attempts to reassign Enum members.
_member_map_を参照して、同名の再代入に例外を送出する
(呼ばれる次点でnameは名前の文字列)
__getitem__
[]でのアクセスをサポートする実装
_member_map_[name]
__getattr__
.でのアクセスをサポートする実装
ダンダーでなければ_member_map[name]