为什么Python中没有@override decorator来帮助代码可读性?

2024-06-01 00:05:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中使用了抽象类和ABCMeta。当您编写一个抽象方法时,您可以用decorator@abstractmethod标记它。我发现有一件事很奇怪(和其他语言不同),那就是当子类重写超类方法时,没有提供像@override这样的装饰器。有人知道这背后的逻辑吗?

对于阅读代码的人来说,快速确定哪些方法重写/实现抽象方法,而不是仅存在于子类中的方法,这会让人有点困惑。


Tags: 方法代码标记语言抽象类装饰decorator逻辑
2条回答

试图添加@override的问题是,在方法定义时,decorator无法判断该方法是否实际重写了另一个方法。它不能访问父类(或者当前的类,它甚至还不存在!)。

如果要添加@override@override装饰器实际上不能执行任何重写检查。然后你有两个选择。要么是没有覆盖检查,在这种情况下,@override不比注释好,要么是type构造函数需要特别了解@override,并在类创建时检查它。像@override这样的便利特性真的不应该使类型系统实现的核心部分复杂化。此外,如果您意外地将@override放在非方法上,则在尝试调用修饰函数并获得奇怪的TypeError之前,该错误将不会被发现。

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

相关问题 更多 >