diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc
index 7063ab2..8dd915e 100644
--- a/compiler/cpp/src/thrift/generate/t_py_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc
@@ -871,7 +871,12 @@
       }
 
       if (is_immutable(tstruct)) {
-        if (gen_newstyle_ || gen_dynamic_) {
+        if (gen_enum_ && type->is_enum()) {
+          indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
+                      << (*m_iter)->get_name() << "', " << (*m_iter)->get_name()
+                      << " if hasattr("  << (*m_iter)->get_name() << ", 'value') else "
+                      << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << endl;
+        } else if (gen_newstyle_ || gen_dynamic_) {
           indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
                       << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << endl;
         } else {
@@ -905,6 +910,32 @@
     }
 
     out << "))" << endl;
+  } else if (gen_enum_) {
+    bool has_enum = false;
+    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+      t_type* type = (*m_iter)->get_type();
+      if (type->is_enum()) {
+        has_enum = true;
+        break;
+      }
+    }
+
+    if (has_enum) {
+      out << endl;
+      indent(out) << "def __setattr__(self, name, value):" << endl;
+      indent_up();
+      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+        t_type* type = (*m_iter)->get_type();
+        if (type->is_enum()) {
+          out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << endl
+              << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else "
+              << type_name(type) << ".__members__.get(value))" << endl
+              << indent() << indent_str() << "return" << endl;
+        }
+      }
+      indent(out) << "super().__setattr__(name, value)" << endl << endl;
+      indent_down();
+    }
   }
 
   if (!gen_dynamic_) {
@@ -2287,7 +2318,7 @@
     out << endl;
   } else if (type->is_enum()) {
     if (gen_enum_) {
-      indent(out) << name << " = " << type_name(type) << "(iprot.readI32()).name";
+      indent(out) << name << " = " << type_name(type) << "(iprot.readI32())";
     } else {
       indent(out) << name << " = iprot.readI32()";
     }
@@ -2477,7 +2508,7 @@
       }
     } else if (type->is_enum()) {
       if (gen_enum_){
-        out << "writeI32(" << type_name(type) << "[" << name << "].value)";
+        out << "writeI32(" << name << ".value)";
       } else {
         out << "writeI32(" << name << ")";
       }
diff --git a/test/py/explicit_module/EnumSerializationTest.py b/test/py/explicit_module/EnumSerializationTest.py
new file mode 100644
index 0000000..8d82708
--- /dev/null
+++ b/test/py/explicit_module/EnumSerializationTest.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+from __future__ import annotations
+
+import sys
+from shared_types.ttypes import SharedEnum
+from thrift.TSerialization import serialize, deserialize
+from thrift.protocol import TBinaryProtocol
+from thrift.transport import TTransport
+
+def deserialize_immutable(base,
+                buf,
+                protocol_factory=TBinaryProtocol.TBinaryProtocolFactory()):
+    transport = TTransport.TMemoryBuffer(buf)
+    protocol = protocol_factory.getProtocol(transport)
+    return base.read(protocol)
+
+def serialization_deserialization_struct_enum_test():
+    test_obj = TestStruct(param1="test_string", param2=TestEnum.TestEnum1, param3=SharedEnum.SharedEnum1)
+    test_obj_serialized = serialize(test_obj)
+    test_obj2 = deserialize(TestStruct(), test_obj_serialized)
+    assert test_obj.param1 == test_obj2.param1
+    assert test_obj.param2 == test_obj2.param2
+    assert test_obj.param3 == test_obj2.param3
+
+def serialization_deserialization_struct_enum_as_string_test():
+    test_obj = TestStruct(param1="test_string", param2=TestEnum.TestEnum1.name, param3=SharedEnum.SharedEnum1.name)
+    test_obj_serialized = serialize(test_obj)
+    test_obj2 = deserialize(TestStruct(), test_obj_serialized)
+    assert test_obj.param1 == test_obj2.param1
+    assert test_obj.param2 == test_obj2.param2
+    assert test_obj.param3 == test_obj2.param3
+
+def serialization_deserialization_exception_enum_as_string_test():
+    test_obj = TestException(whatOp=0, why=SharedEnum.SharedEnum0.name, who=TestEnum.TestEnum0.name)
+    test_obj_serialized = serialize(test_obj)
+    test_obj2 = deserialize_immutable(TestException, test_obj_serialized)
+    assert test_obj.whatOp == test_obj2.whatOp
+    assert test_obj.why == test_obj2.why
+    assert test_obj.who == test_obj2.who
+
+def serialization_deserialization_exception_enum_test():
+    test_obj = TestException(whatOp=0, why=SharedEnum.SharedEnum0, who=TestEnum.TestEnum0)
+    test_obj_serialized = serialize(test_obj)
+    test_obj2 = deserialize_immutable(TestException, test_obj_serialized)
+    assert test_obj.whatOp == test_obj2.whatOp
+    assert test_obj.why == test_obj2.why
+    assert test_obj.who == test_obj2.who
+
+
+
+if __name__ == "__main__":
+    args = sys.argv[1:]
+    if args:
+        from test5_slots.test5.ttypes import TestEnum, TestStruct, TestException
+    else:
+        from test5.ttypes import TestEnum, TestStruct, TestException
+    serialization_deserialization_struct_enum_test()
+    serialization_deserialization_struct_enum_as_string_test()
+    serialization_deserialization_exception_enum_as_string_test()
+    serialization_deserialization_exception_enum_test()
\ No newline at end of file
diff --git a/test/py/explicit_module/runtest.sh b/test/py/explicit_module/runtest.sh
index 2445050..e4618b2 100755
--- a/test/py/explicit_module/runtest.sh
+++ b/test/py/explicit_module/runtest.sh
@@ -25,10 +25,15 @@
 ../../../compiler/cpp/thrift --gen py test3.thrift && exit 1  # Fail since test3.thrift has python keywords
 ../../../compiler/cpp/thrift --gen py:enum shared_types.thrift || exit 1
 ../../../compiler/cpp/thrift --gen py:enum test4.thrift || exit 1
+../../../compiler/cpp/thrift --gen py:enum test5.thrift || exit 1
+mkdir -p ./gen-py/test5_slots
+../../../compiler/cpp/thrift --gen py:enum,slots -out ./gen-py/test5_slots test5.thrift || exit 1
 PYTHONPATH=./gen-py python -c 'import foo.bar.baz' || exit 1
 PYTHONPATH=./gen-py python -c 'import test2' || exit 1
 PYTHONPATH=./gen-py python -c 'import test1' &>/dev/null && exit 1  # Should fail.
 PYTHONPATH=./gen-py python -c 'import test4.constants' || exit 1
+PYTHONPATH=./gen-py python EnumSerializationTest.py || exit 1
+PYTHONPATH=./gen-py python EnumSerializationTest.py slot|| exit 1
 cp -r gen-py simple
 ../../../compiler/cpp/thrift -r --gen py test2.thrift || exit 1
 PYTHONPATH=./gen-py python -c 'import test2' || exit 1
diff --git a/test/py/explicit_module/test5.thrift b/test/py/explicit_module/test5.thrift
new file mode 100644
index 0000000..f281424
--- /dev/null
+++ b/test/py/explicit_module/test5.thrift
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace py test5
+
+include "shared_types.thrift"
+
+enum TestEnum {
+  TestEnum0 = 0,
+  TestEnum1 = 1,
+}
+
+struct TestStruct {
+    1: optional string param1
+    2: optional TestEnum param2
+    3: optional shared_types.SharedEnum param3
+}
+
+/**
+ * Structs can also be exceptions, if they are nasty.
+ */
+exception TestException {
+  1: i32 whatOp,
+  2: shared_types.SharedEnum why
+  3: TestEnum who
+}
\ No newline at end of file
