]> granicus.if.org Git - python/commitdiff
- super() no longer ignores data descriptors, except __class__. See
authorGuido van Rossum <guido@python.org>
Wed, 16 Apr 2003 19:40:58 +0000 (19:40 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 16 Apr 2003 19:40:58 +0000 (19:40 +0000)
  the thread started at
  http://mail.python.org/pipermail/python-dev/2003-April/034338.html

Misc/NEWS
Objects/typeobject.c

index 4095c400827468d2f579ce79b26ecbd9f38269d6..5eef5e9104f5e2f838c29bab754a73750467ba46 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 2.3 beta 1?
 Core and builtins
 -----------------
 
+- super() no longer ignores data descriptors, except __class__.  See
+  the thread started at
+  http://mail.python.org/pipermail/python-dev/2003-April/034338.html
+
 - list.insert(i, x) now interprets negative i as it would be
   interpreted by slicing, so negative values count from the end of the
   list.  This was the only place where such an interpretation was not
index 8f9deae1e8c6eb3ec60758447b841661277b50a9..d45ee89adb0925450488ee97c369a2e62b30ff2c 100644 (file)
@@ -5359,8 +5359,17 @@ static PyObject *
 super_getattro(PyObject *self, PyObject *name)
 {
        superobject *su = (superobject *)self;
+       int skip = su->obj_type == NULL;
 
-       if (su->obj_type != NULL) {
+       if (!skip) {
+               /* We want __class__ to return the class of the super object
+                  (i.e. super, or a subclass), not the class of su->obj. */
+               skip = (PyString_Check(name) &&
+                       PyString_GET_SIZE(name) == 9 &&
+                       strcmp(PyString_AS_STRING(name), "__class__") == 0);
+       }
+
+       if (!skip) {
                PyObject *mro, *res, *tmp, *dict;
                PyTypeObject *starttype;
                descrgetfunc f;
@@ -5390,9 +5399,6 @@ super_getattro(PyObject *self, PyObject *name)
                        else
                                continue;
                        res = PyDict_GetItem(dict, name);
-                       /* Skip data descriptors because when obj_type is a
-                          metaclass, we don't want to return its __class__
-                          descriptor.  See supers() in test_descr.py. */
                        if (res != NULL && !PyDescr_IsData(res)) {
                                Py_INCREF(res);
                                f = res->ob_type->tp_descr_get;