How do I say "two classes up in the inheritance chain" in python?
Bruno Desthuilliers
bruno.42.desthuilliers at websiteburo.invalid
Tue Jan 27 04:14:38 EST 2009
Daniel Fetchinson a écrit :
> I have two classes that both inherit from two other classes which both
> inherit from a single class. The two children have two almost
> identical methods:
>
> class grandparent( object ):
> def meth( self ):
> # do something
>
> class parent1( grandparent ):
> def meth( self ):
> # do something p1
> super( parent1, self ).meth( )
>
> class parent2( grandparent ):
> def meth( self ):
> # do something p2
> super( parent2, self ).meth( )
>
> class child1( parent1 ):
> def meth( self ):
> # do something c
> super( parent1, self ).meth( ) # I want to invoke meth on grandparent
If so, it might be better to explicitly call grandparent.meth (passing
self as first argument). But this is an obvious design smell IMHO. What
you have is :
def meth(self):
do_something_more_or_less_specific
call_granparent
Looks like a candidate for a template method. Since you don't have hand
on Grandparent, the simplest would be to add an additional base class, ie:
class Abstract(Grandparent):
def do_something(self):
raise NotImplementedError
def meth(self):
self.do_something()
super(Abstract, self).meth()
class Parent1(Abstract):
def do_something(self):
# do something p1
class Parent2(Abstract):
def do_something(self):
# do something p2
Now you're problem is to factor out do_something() for Child1 and
Child2. The solution is quite simple : just define it outside the class
statements, and adds it afterward:
def do_something_children(self):
# code here
class Child1(Parent1):
# code here
Child1.do_something = do_something_children
class Child2(Parent2):
# code here
Child2.do_something = do_something_children
HTH
More information about the Python-list
mailing list