例如,在 Java 中,@Override注解不仅提供了对覆盖的编译时检查,而且还提供了出色的自文档化代码。
@Override
我只是在寻找文档(尽管如果它是诸如 pylint 之类的检查器的指标,那是一个奖励)。我可以在某处添加注释或文档字符串,但是在 Python 中指示覆盖的惯用方式是什么?
基于这个和 fwc:s 的回答,我创建了一个 pip 可安装包 https://github.com/mkorpela/overrides
有时我会在这里看到这个问题。这主要发生在(再次)在我们的代码库中看到相同的错误之后:有人在重命名“接口”中的方法时忘记了一些“接口”实现类。
好吧,Python 不是 Java,但 Python 具有强大的功能——并且显式优于隐式——并且在现实世界中有一些真实的具体案例可以帮助我。
所以这里是覆盖装饰器的草图。这将检查作为参数给出的类是否与被装饰的方法具有相同的方法(或其他名称)名称。
如果您能想到更好的解决方案,请在此处发布!
def overrides(interface_class): def overrider(method): assert(method.__name__ in dir(interface_class)) return method return overrider
它的工作原理如下:
class MySuperInterface(object): def my_method(self): print 'hello world!' class ConcreteImplementer(MySuperInterface): @overrides(MySuperInterface) def my_method(self): print 'hello kitty!'
如果你做了一个错误的版本,它会在类加载期间引发一个断言错误:
class ConcreteFaultyImplementer(MySuperInterface): @overrides(MySuperInterface) def your_method(self): print 'bye bye!' >> AssertionError!!!!!!!