How do I say "two classes up in the inheritance chain" in python?

Daniel Fetchinson fetchinson at googlemail.com
Tue Jan 27 18:50:14 CET 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