diff options
author | Guido van Rossum <guido@python.org> | 2001-12-03 15:38:28 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-12-03 15:38:28 (GMT) |
commit | 5b443c6282e8ffd6873005b62c50e56fa149e277 (patch) | |
tree | ad424630007b688380534e7d2181a59aba44c8f6 /Lib | |
parent | 22f9c6ddb81bf486748671c38b1cea53b88f1f82 (diff) | |
download | cpython-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.py | 52 |
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..." |