diff -r bda5a87df1c8 Lib/enum.py --- a/Lib/enum.py Fri Sep 13 06:27:52 2013 -0700 +++ b/Lib/enum.py Fri Sep 13 12:52:10 2013 -0400 @@ -489,6 +489,19 @@ def value(self): return self._value_ + def __getattr__(self, name): + """Return the enum member matching `name` + + We use __getattr__ instead of descriptors or inserting into the enum + class' __dict__ in order to prevent overriding attributes in classes + inheriting from Enum. + + """ + try: + return self.__class__._member_map_[name] + except KeyError: + raise AttributeError(name) from None + class IntEnum(int, Enum): """Enum where members are also (and must be) ints""" diff -r bda5a87df1c8 Lib/test/test_enum.py --- a/Lib/test/test_enum.py Fri Sep 13 06:27:52 2013 -0700 +++ b/Lib/test/test_enum.py Fri Sep 13 12:52:10 2013 -0400 @@ -1072,6 +1072,16 @@ self.assertEqual(LabelledList.unprocessed, 1) self.assertEqual(LabelledList(1), LabelledList.unprocessed) + def test_enum_values_as_attr_of_enum_values(self): + class Colors(IntEnum): + red = 1 + green = 2 + blue = 3 + + value = Colors.red + self.assertEqual(value, value.red) + self.assertNotEqual(value, value.blue) + class TestUnique(unittest.TestCase):