Search code examples
pythonclassoverridingabstract-class

How to detect method overloading in subclasses in python?


I have a class that is a super-class to many other classes. I would like to know (in the __init__() of my super-class) if the subclass has overridden a specific method.

I tried to accomplish this with a class method, but the results were wrong:

class Super:
   def __init__(self):
      if self.method == Super.method:
         print 'same'
      else:
         print 'different'
     
   @classmethod
   def method(cls):
      pass

class Sub1(Super):
   def method(self):
      print 'hi'
  
class Sub2(Super):
   pass

Super() # should be same
Sub1() # should be different
Sub2() # should be same

>>> same
>>> different
>>> different

Is there any way for a super-class to know if a sub-class has overridden a method?


Solution

  • You can use your own decorator. But this is a trick and will only work on classes where you control the implementation.

    def override(method):
      method.is_overridden = True
      return method
    
    class Super:
       def __init__(self):
          if hasattr(self.method, 'is_overridden'):
             print 'different'
          else:
             print 'same'
       @classmethod
       def method(cls):
          pass
    
    class Sub1(Super):
       @override
       def method(self):
          print 'hi'
    
    class Sub2(Super):
       pass
    
    Super() # should be same
    Sub1() # should be different
    Sub2() # should be same
    
    >>> same
    >>> different
    >>> same