Skipping a superclass

Miles Kaufmann milesck at umich.edu
Mon Aug 3 03:15:10 CEST 2009


On Aug 2, 2009, at 5:36 AM, Steven D'Aprano wrote:
> I have a series of subclasses like this:
>
> class A(object):
>    def method(self, *args):
>        print "Lots of work gets done here in the base class"
>
> class B(A):
>    def method(self, *args):
>        print "A little bit of work gets done in B"
>        super(B, self).method(*args)
>
> class C(B):
>    def method(self, *args):
>        print "A little bit of work gets done in C"
>        super(C, self).method(*args)
>
>
> However, the work done in C.method() makes the work done in B.method()
> obsolete: I want one to run, or the other, but not both. C does need  
> to
> inherit from B, for the sake of the other methods, so I want  
> C.method()
> *only* to skip B while still inheriting from A. (All other methods  
> have
> to inherit from B as normal.)

This might not be applicable to the larger problem you're trying to  
solve, but for this sample, I would write it as:

class A(object):
     def method(self, *args):
         self._method(*args)
         print "Lots of work gets done here in the base class"
     def _method(self, *args):
         pass # or perhaps raise NotImplemented

class B(A):
     def _method(self, *args):
         print "A little bit of work gets done in B"

class C(B):
     def _method(self, *args):
         print "A little bit of work gets done in C"

> So what I have done is change the call to super in C to super(B, self)
> instead of super(C, self). It seems to work, but is this safe to do?  
> Or
> are there strange side-effects I haven't seen yet?

In a diamond-inheritance situation, you may end up skipping methods  
besides just B.method().

-Miles




More information about the Python-list mailing list