From 76ba09fd81246c21f0de25f559d4da47b457f2e2 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 16 Apr 2003 19:40:58 +0000 Subject: - super() no longer ignores data descriptors, except __class__. See the thread started at http://mail.python.org/pipermail/python-dev/2003-April/034338.html --- Misc/NEWS | 4 ++++ Objects/typeobject.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 4095c40..5eef5e9 100644 --- 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 diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 8f9deae..d45ee89 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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; -- cgit v0.12