使用装饰器和通过继承扩展子类有什么区别?

3 投票
2 回答
886 浏览
提问于 2025-04-16 07:21

我一直在努力理解Python中的装饰器,但我搞不明白为什么我们不能通过使用子类来实现同样的功能呢?

2 个回答

1
  1. 你知道在定义前加上 @spam class|def name 的意思吗?这其实就是“先按这里写的定义一个名字,然后把这个名字绑定到 spam(name) 上”。

  2. 装饰器通常是用在函数上,而不是类上。没错,你可以创建一个可调用的类,然后继承它……你也可以自己实现一个整数类型。但这两种方法都不太实际。

  3. 在很多情况下,你可能可以通过继承来做类似的事情……不过装饰器是一次定义,可以应用到多个类上,而不是每次都要自己写一个新的子类。最终你会发现,任何其他解决方案都和装饰器非常相似。

正如robert在评论中提到的,如果你有个例子,答案会更具体……

4

你可以通过子类来实现同样的功能,其实你甚至不需要子类。你只需把一个方法放在另一个方法里,然后重新赋值,就能达到同样的效果。关于是否应该把装饰器语法加入到语言中,大家讨论了很多,因为它并没有带来什么新功能,还让程序员多学了一样东西。

这个语法的作用是把很多人已经在用的一个模式正式化,变成一种有名字和使用指南的标准语法。虽然你不一定要使用装饰器,其他方法也能达到同样的效果,但使用这种官方支持的标准方式,语法简洁易读,确实让生活简单一些。

撰写回答