@@ -112,6 +112,10 @@ def __new__(metacls, cls, bases, classdict):
112112 enum_class ._member_map_ = OrderedDict () # name->value map
113113 enum_class ._member_type_ = member_type
114114
115+ # save attributes from super classes so we know if we can take
116+ # the shortcut of storing members in the class dict
117+ base_attributes = {a for b in bases for a in b .__dict__ }
118+
115119 # Reverse value->name map for hashable values.
116120 enum_class ._value2member_map_ = {}
117121
@@ -165,6 +169,11 @@ def __new__(metacls, cls, bases, classdict):
165169 else :
166170 # Aliases don't appear in member names (only in __members__).
167171 enum_class ._member_names_ .append (member_name )
172+ # performance boost for any member that would not shadow
173+ # a DynamicClassAttribute
174+ if member_name not in base_attributes :
175+ setattr (enum_class , member_name , enum_member )
176+ # now add to _member_map_
168177 enum_class ._member_map_ [member_name ] = enum_member
169178 try :
170179 # This may fail if value is not hashable. We can't add the value
@@ -468,7 +477,7 @@ def __dir__(self):
468477 m
469478 for cls in self .__class__ .mro ()
470479 for m in cls .__dict__
471- if m [0 ] != '_'
480+ if m [0 ] != '_' and m not in self . _member_map_
472481 ]
473482 return (['__class__' , '__doc__' , '__module__' ] + added_behavior )
474483
0 commit comments