diff options
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Objects/typeobject.c | 14 |
2 files changed, 14 insertions, 4 deletions
@@ -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; |