Yonatan Yonatan - 7 months ago 21
Python Question

python parent class 'wrapping' child-class methods



I have the following situation in my python code:

class Parent(object):
def run(self):
print "preparing for run"
self.runImpl()
print "run done"

class Child(Parent):
def runImpl(self):
print "child running"


However, I have several such 'decorators', doing different setup/teardown steps before and after 'runImpl', and I don't like having to define
run()
,
runImpl()
,
runImplSingleProcess()
etc.

I am looking for a solution of the following form:

class Parent(object):
@wrapping_child_call
def run(self, func_impl, *args, **kwargs)
print "preparing for run"
func_impl(*args, **kwargs)
print "run done"

class Child(Parent):
def run(self):
print "child running"


In this way, there is almost no need for Child class to be aware of this going on.

There may also be an issue with multiple inheritance. If a
Child
inherits from
Parent1
and
Parent2
, I honestly don't know what should be the correct behavior.

Does anyone know a good, natural, way of accomplishing this? or am I raping the design here?

Thanks

Yonatan

Answer

Don't use inheritance here

Invert your design. Instead of a parent-child implementation which is a "is-a" relationship why not just have a composition so you get a "has-a" relationship? You could define classes which implement the methods you'd like while your previous parent class would be instantiated with those implementation specific classes.

class MyClass:
    def __init__(self, impl)
        self.impl = impl
    def run(self,var):
        print "prepare"
        impl.runImpl(var)
        print "I'm done"

class AnImplementation:
    def runImpl(self,var):