inheritance problem with 2 cooperative methods

Greg Ewing greg at cosc.canterbury.ac.nz
Fri Dec 3 03:54:03 CET 2004


Dan Perl wrote:
> So far, so good!  But let's assume that I want to change the __init__ 
> methods so that they take a configuration as an argument so the objects are 
> created and configured in one step, like this:
> alpha = A(config)

One way would be to make the setConfig call only
in the root class, and perform the initialisation
that it depends on *before* making the super call
in each __init__ method, i.e.

class A (object):
    def __init__(self, config):
       self.x = 0
       self.setConfig(config)

class B (A):
    def __init__(self, config):
       self.y = 0
       super(B, self).__init__(config)

class C (B):
    def __init__(self, config):
       self.z = 0
       super(C, self).__init__(config)

This works here because each of the initialisation
operations is self-contained. It might not work so well
in real life if some of the base class state needs to be
initialised before the subclass initialisation can be
performed. However, it's worth considering -- I came
across the same sort of problem several times in
PyGUI, and I usually managed to solve it by carefully
arranging initialisations before and after the super
call.

If you can't use that solution, I would suggest you
keep the __init__ and setConfig operations separate,
and live with having to call setConfig after creating
an object. Factory functions could be provided if
you were doing this a lot.

-- 
Greg Ewing, Computer Science Dept,
University of Canterbury,	
Christchurch, New Zealand
http://www.cosc.canterbury.ac.nz/~greg




More information about the Python-list mailing list