summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_descr.py14
-rw-r--r--Objects/typeobject.c9
2 files changed, 22 insertions, 1 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index ccb9fe6..a224bb9 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -2064,6 +2064,20 @@ def supers():
vereq(dd.x, "hello")
vereq(super(DDsub, dd).x, 42)
+ # Ensure that super() lookup of descriptor from classmethod
+ # works (SF ID# 743627)
+
+ class Base(object):
+ aProp = property(lambda self: "foo")
+
+ class Sub(Base):
+ def test(klass):
+ return super(Sub,klass).aProp
+ test = classmethod(test)
+
+ veris(Sub.test(), Base.aProp)
+
+
def inherits():
if verbose: print "Testing inheritance from basic types..."
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index f26ddd6..209ec32 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -5537,7 +5537,14 @@ super_getattro(PyObject *self, PyObject *name)
Py_INCREF(res);
f = res->ob_type->tp_descr_get;
if (f != NULL) {
- tmp = f(res, su->obj,
+ tmp = f(res,
+ /* Only pass 'obj' param if
+ this is instance-mode super
+ (See SF ID #743627)
+ */
+ (su->obj==su->obj_type
+ ? (PyObject *)NULL
+ : su->obj),
(PyObject *)starttype);
Py_DECREF(res);
res = tmp;