summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-12-03 15:38:28 (GMT)
committerGuido van Rossum <guido@python.org>2001-12-03 15:38:28 (GMT)
commit5b443c6282e8ffd6873005b62c50e56fa149e277 (patch)
treead424630007b688380534e7d2181a59aba44c8f6 /Lib
parent22f9c6ddb81bf486748671c38b1cea53b88f1f82 (diff)
downloadcpython-5b443c6282e8ffd6873005b62c50e56fa149e277.zip
cpython-5b443c6282e8ffd6873005b62c50e56fa149e277.tar.gz
cpython-5b443c6282e8ffd6873005b62c50e56fa149e277.tar.bz2
Address SF patch #480716 as well as related issues.
SF patch #480716 by Greg Chapman fixes the problem that super's __get__ method always returns an instance of super, even when the instance whose __get__ method is called is an instance of a subclass of super. Other issues fixed: - super(C, C()).__class__ would return the __class__ attribute of C() rather than the __class__ attribute of the super object. This is confusing. To fix this, I decided to change the semantics of super so that it only applies to code attributes, not to data attributes. After all, overriding data attributes is not supported anyway. - While super(C, x) carefully checked that x is an instance of C, super(C).__get__(x) made no such check, allowing for a loophole. This is now fixed.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_descr.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 8166d7c..f3b81ac 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -1572,7 +1572,57 @@ def supers():
def meth(self, a):
return "D(%r)" % a + super(D, self).meth(a)
- verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
+ vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
+
+ # Test for subclassing super
+
+ class mysuper(super):
+ def __init__(self, *args):
+ return super(mysuper, self).__init__(*args)
+
+ class E(D):
+ def meth(self, a):
+ return "E(%r)" % a + mysuper(E, self).meth(a)
+
+ vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
+
+ class F(E):
+ def meth(self, a):
+ s = self.__super
+ return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
+ F._F__super = mysuper(F)
+
+ vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
+
+ # Make sure certain errors are raised
+
+ try:
+ super(D, 42)
+ except TypeError:
+ pass
+ else:
+ raise TestFailed, "shouldn't allow super(D, 42)"
+
+ try:
+ super(D, C())
+ except TypeError:
+ pass
+ else:
+ raise TestFailed, "shouldn't allow super(D, C())"
+
+ try:
+ super(D).__get__(12)
+ except TypeError:
+ pass
+ else:
+ raise TestFailed, "shouldn't allow super(D).__get__(12)"
+
+ try:
+ super(D).__get__(C())
+ except TypeError:
+ pass
+ else:
+ raise TestFailed, "shouldn't allow super(D).__get__(C())"
def inherits():
if verbose: print "Testing inheritance from basic types..."