Can a base class know if a method has been overridden?

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Sat Sep 22 08:33:19 EDT 2007


Ratko a écrit :
 > bruno a écrit
>>Another solution is to compare the functions wrapped by the methods:
>>
>>class EvtHandler:
>>     def __init__(self):
>>         onKey = getattr(self, 'onKey')
>>         if onKey.im_func is EvtHandler.onKey.im_func:

s/is/is not/, of course

>>              register_for_key_events()
>>
>>      def onKey(self):
>>         pass
>>
>>class MyHandler(EvtHandler):
>>     def onKey(self):
>>         # do something here....
>>
>>HTH
> 
> 
> The second solution works beautifully! 

Hem... Almost !-)

> Thank you very much.
> I was aware that not implementing the onKey method in the first place
> is the simplest solution but it's much cleaner to offer the methods in
> advance so that the user can see what is possible.

Yeps - a placeholder 'abstract' method with only a docstring. It's a 
common pattern in frameworks, but usually it's just an ordinary template 
method pattern defaulting to a no-op.

FWIW, if you have several such methods to handle, you can use a more 
generic approach:

_handlers = {
     'onKey':registerForKeyEvents,
     'onClick':registerForMouseEvents,
} # etc

class EventHandler(object):
     for _name in _handlers:
         exec "%s=lambda self, *args, **kw: pass" % _name

     def __new__(cls, *args, **kw):
        obj = object.__new__(cls, *args, **kw)
        for name, register_func in _handlers.items():
            meth = getattr(obj, name)
            dummy = getattr(EventHandler, name)
            if meth.im_func is not dummy.im_func:
                 register_func(meth)
        return obj


HTH



More information about the Python-list mailing list