我一直在使用Python中的抽象类ABCMeta
.当你编写一个抽象方法时,你用装饰器标记它@abstractmethod
.我发现奇怪的一件事(和其他语言不同)是当子类重写超类方法时,没有@override
提供类似的装饰器.有谁知道这背后的逻辑是什么?
这使得读取代码的人快速确定哪些方法覆盖/实现抽象方法与仅存在于子类中的方法有点混淆.
尝试添加的问题@override
是在方法定义时,装饰器无法判断该方法是否实际覆盖了另一个方法.它无权访问父类(或当前类,甚至还不存在!).
如果要添加@override
,@override
装饰器实际上不能执行任何覆盖检查.然后你有两个选择.无论是有是无覆盖检查,在此情况下,@override
没有比一个更好的意见或type
构造函数需要具体了解@override
,并在类的创建时间检查.像这样的便利功能@override
不应该像这样复杂类型系统实现的核心部分.此外,如果您不小心@override
使用了非方法,则在您尝试调用修饰函数并获得奇怪的TypeError之前,该错误将不会被检测到.
你将Python装饰器与Java注释混淆了.尽管语法相似,但它们完全不同.Java注释是对编译器的指令.但是Python装饰器是可执行代码,可以执行具体的操作:它将函数包装在另一个可以改变其功能的函数中.这与abstractmethod的情况一样,与任何其他装饰器一样多; 它做了一些事情,即告诉ABC有一种方法需要覆盖.