How do I say "two classes up in the inheritance chain" in python?
Daniel Fetchinson
fetchinson at googlemail.com
Tue Jan 27 12:50:14 EST 2009
>> 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
Thanks, this was very helpful. Also, thanks Duncan, your simple
suggestion was helpful too to just call the grandparent directly
(without super).
Cheers,
Daniel
--
Psss, psss, put it down! - http://www.cafepress.com/putitdown
More information about the Python-list
mailing list