小编典典

在 Python 中,我如何表明我正在覆盖一个方法?

all

例如,在 Java 中,@Override注解不仅提供了对覆盖的编译时检查,而且还提供了出色的自文档化代码。

我只是在寻找文档(尽管如果它是诸如 pylint 之类的检查器的指标,那是一个奖励)。我可以在某处添加注释或文档字符串,但是在 Python
中指示覆盖的惯用方式是什么?


阅读 129

收藏
2022-06-11

共1个答案

小编典典

基于这个和 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!!!!!!!
2022-06-11