Can a base class know if a method has been overridden?
Bruno Desthuilliers
bruno.42.desthuilliers at wtf.websiteburo.oops.com
Mon Sep 24 12:42:27 EDT 2007
Ratko a écrit :
>> If your use case is to make sure a given ('abstract') method has been
>> overriden, the canonical solution is to raise NotImplementedError in the
>> base class's implementation
>
> I am not really interested in forcing the subclass to implement a
> method. I am interested in knowing *whether* it did implement it or
> not.
>
>
>> Else, this may be possible using a custom metaclass (or possibly just
>> specializing the __new__ method), but there may be better solutions
>> (depending on what you're really trying to do)..
>
> I have a base class EvtHandler that has methods defined to handle
> certain events. You then subclass from EvtHandler and override the
> methods for the events you want to receive. If a method has been
> overridden, the base class will automatically register for those
> events to make sure that they are even delivered to this handler
> (which is why I would need to know whether a method has been
> overridden or not). Of course, there are other ways of doing this
> which would require a bit more work from the subclass... I just
> thought this would be a neat "automatic" way of registering for
> events.
>
> For example:
>
> class EvtHandler:
> def __init__(self):
> if onKey is overridden:
> register_for_key_events()
>
> def onKey(self):
> pass
>
>
> class MyHandler(EvtHandler):
> def onKey(self):
> # do something here....
>
Ok. The simplest solution, then, is simply to not implement the method
in the base class, ie:
class EvtHandler:
def __init__(self):
if hasattr(self, 'onKey'):
register_for_key_events()
#def onKey(self):
# pass
class MyHandler(EvtHandler):
def onKey(self):
# do something here....
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:
register_for_key_events()
def onKey(self):
pass
class MyHandler(EvtHandler):
def onKey(self):
# do something here....
HTH
More information about the Python-list
mailing list