在Python中,装饰器(Decorators)是一种强大的工具,它允许程序员在不修改现有函数或类代码的情况下,为它们添加额外的功能。装饰器本质上是一个接受函数或类作为参数的可调用对象,并返回一个新的函数或类对象。
函数装饰器(Function Decorator)
函数装饰器用于修改或增强函数的行为。它们通常在函数定义之前通过@
符号应用。函数装饰器接受一个函数作为参数,并返回一个新的函数对象。
下面是一个简单的函数装饰器的例子:
python复制代码
def my_decorator(func): | |
def wrapper(): | |
print("Something is happening before the function is called.") | |
func() | |
print("Something is happening after the function is called.") | |
return wrapper | |
@my_decorator | |
def say_hello(): | |
print("Hello!") | |
# 当调用 say_hello() 时,实际上调用的是 wrapper(),它会在 say_hello() 前后添加额外的输出。 | |
say_hello() |
输出将是:
复制代码
Something is happening before the function is called. | |
Hello! | |
Something is happening after the function is called. |
类装饰器(Class Decorator)
类装饰器与函数装饰器类似,但是它们应用于类而不是函数。类装饰器接受一个类作为参数,并返回一个新的类对象(通常是对原始类进行修改或增强的版本)。
类装饰器同样使用@
符号,但是它们应用于类定义之前。
下面是一个简单的类装饰器的例子:
python复制代码
def my_class_decorator(cls): | |
class NewClass(cls): | |
def new_method(self): | |
return "This is a new method" | |
# 还可以选择性地覆盖原始类的方法 | |
def __str__(self): | |
return f"Modified {super().__str__()}" | |
return NewClass | |
@my_class_decorator | |
class MyClass: | |
def __init__(self, name): | |
self.name = name | |
def __str__(self): | |
return self.name | |
# 创建 MyClass 的实例时,实际上使用的是被 my_class_decorator 修改过的类 | |
obj = MyClass("Original") | |
print(obj) # 输出:Modified Original | |
print(obj.new_method()) # 输出:This is a new method |
区别
- 作用对象:函数装饰器作用于函数,而类装饰器作用于类。
- 返回类型:函数装饰器通常返回一个新的函数对象,而类装饰器返回一个新的类对象。
- 应用场景:函数装饰器常用于为函数添加日志记录、性能监控、权限检查等通用功能。类装饰器则常用于动态地修改类的行为,如添加新方法、修改类的元信息(如
__annotations__
)等。 - 语法:两者在语法上都是通过
@
符号和装饰器名称来应用的,但应用的上下文(函数定义或类定义)不同。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Python中的函数装饰器(function decorator)和类装饰器(class decorator)的区别。
发表评论 取消回复