bpo-44655: Include the name of the type in unset __slots__ attribute errors (GH-27199) (GH-27201)

(cherry picked from commit f783428a2313a729ca8b539c5a86ff114b9ff375)

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>

Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
diff --git a/Python/structmember.c b/Python/structmember.c
index ba88e15..c7e3188 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -5,11 +5,11 @@
 #include "structmember.h"         // PyMemberDef
 
 PyObject *
-PyMember_GetOne(const char *addr, PyMemberDef *l)
+PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
 {
     PyObject *v;
 
-    addr += l->offset;
+    const char* addr = obj_addr + l->offset;
     switch (l->type) {
     case T_BOOL:
         v = PyBool_FromLong(*(char*)addr);
@@ -69,8 +69,13 @@ PyMember_GetOne(const char *addr, PyMemberDef *l)
         break;
     case T_OBJECT_EX:
         v = *(PyObject **)addr;
-        if (v == NULL)
-            PyErr_SetString(PyExc_AttributeError, l->name);
+        if (v == NULL) {
+            PyObject *obj = (PyObject *)obj_addr;
+            PyTypeObject *tp = Py_TYPE(obj);
+            PyErr_Format(PyExc_AttributeError,
+                         "'%.200s' object has no attribute '%s'",
+                         tp->tp_name, l->name);
+       }
         Py_XINCREF(v);
         break;
     case T_LONGLONG: