[Tutor] which gets called

Steven D'Aprano steve at pearwood.info
Fri Apr 6 16:43:27 CEST 2012


John Fabiani wrote:
> Hi,
> 
> I want to create a class that inherits two other classes.
> 
> class NewClass( A,B)
> 
> But both "A" and "B" contain a method with the same name ("onKeyDown"). 
> 
> If my "NewClass" does not contain something to override the methods which one 
> would be called if
> 
> myinstance = NewClass()
> 
> myinstance.onKeyDown()


This depends on whether classes A and B are designed for cooperative multiple 
inheritance or not.

The short answer is, A.onKeyDown will be called, because A is listed first.

The longer answer is, if A.onKeyDown uses super() to manager multiple 
inheritance, both A and B.onKeyDown may be called.


Here is an example with no cooperative multiple inheritance:

class A(object):
     def onKeyDown(self):
         print('A deals with keydown event')

class B(object):
     def onKeyDown(self):
         print('B deals with keydown event')

class NewClass(A, B):
     pass


And in use, you will see that A blocks B:

py> instance = NewClass()
py> instance.onKeyDown()
A deals with keydown event



And here is a second example using super() for cooperative multiple inheritance:

class A(object):
     def onKeyDown(self):
         print('A deals with keydown event')
         super(A, self).onKeyDown()
         # in Python 3, you can just use "super().onKeyDown()"

class B(object):
     def onKeyDown(self):
         print('B deals with keydown event')
         # B does not call super(), because there are no
         # further parent classes to call.

class NewClass(A, B):
     pass


And in use:


py> instance = NewClass()
py> instance.onKeyDown()
A deals with keydown event
B deals with keydown event





> Second to insure the right one is called is it possible to do the following
> 
> NewClass(object):
>   def onKeyDown(self, event):
>       b.onKeyDown(event)

Yes, but that normally should not be necessary if you design your classes 
carefully.



-- 
Steven



More information about the Tutor mailing list