为什么Python中没有@override装饰器来帮助编写可读性?

时间:2015-12-29 23:54:05

标签: python inheritance python-decorators

我一直在使用ABCMeta在Python中使用抽象类。当您编写抽象方法时,使用装饰器@abstractmethod对其进行标记。我发现奇怪的一件事(与其他语言不同)是,当子类重写超类方法时,不提供像@override这样的装饰器。有谁知道这背后的逻辑是什么?

这使得阅读代码的人快速确定哪些方法覆盖/实现抽象方法与仅存在于子类中的方法有点混淆。

2 个答案:

答案 0 :(得分:9)

您将Python装饰器与Java注释混淆。尽管语法相似,但它们完全不同。 Java注释是对编译器的指令。但是Python装饰器是可执行代码,可以执行具体的操作:它将函数包装在另一个可以改变其功能的函数中。这与abstractmethod的情况一样,与任何其他装饰器一样多;它做某事,即告诉ABC有一种方法需要覆盖。

答案 1 :(得分:8)

尝试添加@override时的问题是,在方法定义时,装饰器无法判断该方法是否实际覆盖了另一个方法。它无权访问父类(或当前类,甚至还不存在!)。

如果要添加@override@override装饰器实际上无法执行任何覆盖检查。然后你有两个选择。要么 没有覆盖检查,在这种情况下@override并不比评论更好,或type构造函数需要具体了解@override并检查它在课堂创作时间。像@override这样的便利功能实际上不需要像这样复杂类型系统实现的核心部分。此外,如果您不小心将@override置于非方法上,则在您尝试调用修饰函数并获得奇怪的TypeError之前,该错误将不会被检测到。