Paul Rubin wrote: > I'm trying the super() function as described in Python Cookbook, 1st > ed, p. 172 (Recipe 5.4). > > class A(object): > def f(self): > print 'A' > > > class B(object): > def f(self): > print 'b' > > > class C(A,B): > def f(self): Typo? 'c' should be 'C' in: > super(c,self).f() > print 'C' > > def test(cls): > x = cls() > x.f() > > test(C) > > I have the impression that this is supposed to call the f method > in both A and B, so it should print > A > B > C > or maybe > B > A > C > depending on the resolution order. However, it only calls A.f and not > B.f.
You misunderstand. A single call to super only calls the next method in the chain. You have to include calls to super at all levels except for the ultimate base class. > > I also notice that if I say > > > class B(object): > def f(self): > super(B,self).f() > print 'b' > > then > test(B) > raises an exception since B has no superclass with an f method. That > doesn't seem like such a good thing necessarily. You have to terminate the chain somehow. e.g. class MyBase(object): def f(self): print "MyBase" class A(MyBase): def f(self): super(A, self).f() print "A" ... class B(MyBase): def f(self): super(B, self).f() print "B" ... > > Anyway, is there a preferred way of writing this example so that C.f > automatically calls both A.f and B.f? The trick is that C.f only calls A.f, but A.f needs to end up calling B.f when it is used in a C. -- http://mail.python.org/mailman/listinfo/python-list