pythoninheritanceoverridingself-documenting-code

In Python, how do I indicate I'm overriding a method?


In Java, for example, the @Override annotation not only provides compile-time checking of an override but makes for excellent self-documenting code.

I'm just looking for documentation (although if it's an indicator to some checker like pylint, that's a bonus). I can add a comment or docstring somewhere, but what is the idiomatic way to indicate an override in Python?


Solution

  • Based on this and fwc:s answer I created a pip installable package https://github.com/mkorpela/overrides

    From time to time I end up here looking at this question. Mainly this happens after (again) seeing the same bug in our code base: Someone has forgotten some "interface" implementing class while renaming a method in the "interface"..

    Well Python ain't Java but Python has power -- and explicit is better than implicit -- and there are real concrete cases in the real world where this thing would have helped me.

    So here is a sketch of overrides decorator. This will check that the class given as a parameter has the same method (or something) name as the method being decorated.

    If you can think of a better solution please post it here!

    def overrides(interface_class):
        def overrider(method):
            assert(method.__name__ in dir(interface_class))
            return method
        return overrider
    

    It works as follows:

    class MySuperInterface(object):
        def my_method(self):
            print 'hello world!'
    
    
    class ConcreteImplementer(MySuperInterface):
        @overrides(MySuperInterface)
        def my_method(self):
            print 'hello kitty!'
    

    and if you do a faulty version it will raise an assertion error during class loading:

    class ConcreteFaultyImplementer(MySuperInterface):
        @overrides(MySuperInterface)
        def your_method(self):
            print 'bye bye!'
    
    >> AssertionError!!!!!!!