Issue #14849: setup Element data members to be assignable in subclasses
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 4263497..d74b497 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -1640,16 +1640,15 @@
     return res;
 }
 
-static int
-element_setattr(ElementObject* self, const char* name, PyObject* value)
+static PyObject*
+element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
 {
-    if (value == NULL) {
-        PyErr_SetString(
-            PyExc_AttributeError,
-            "can't delete element attributes"
-            );
-        return -1;
-    }
+    char *name = "";
+    if (PyUnicode_Check(nameobj))
+        name = _PyUnicode_AsString(nameobj);
+
+    if (name == NULL)
+        return NULL;
 
     if (strcmp(name, "tag") == 0) {
         Py_DECREF(self->tag);
@@ -1671,10 +1670,10 @@
         Py_INCREF(self->extra->attrib);
     } else {
         PyErr_SetString(PyExc_AttributeError, name);
-        return -1;
+        return NULL;
     }
 
-    return 0;
+    return NULL;
 }
 
 static PySequenceMethods element_as_sequence = {
@@ -1700,7 +1699,7 @@
     (destructor)element_dealloc,                    /* tp_dealloc */
     0,                                              /* tp_print */
     0,                                              /* tp_getattr */
-    (setattrfunc)element_setattr,                   /* tp_setattr */
+    0,                                              /* tp_setattr */
     0,                                              /* tp_reserved */
     (reprfunc)element_repr,                         /* tp_repr */
     0,                                              /* tp_as_number */
@@ -1710,7 +1709,7 @@
     0,                                              /* tp_call */
     0,                                              /* tp_str */
     (getattrofunc)element_getattro,                 /* tp_getattro */
-    0,                                              /* tp_setattro */
+    (setattrofunc)element_setattro,                 /* tp_setattro */
     0,                                              /* tp_as_buffer */
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
                                                     /* tp_flags */