在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__)等。
  • 语法:两者在语法上都是通过@符号和装饰器名称来应用的,但应用的上下文(函数定义或类定义)不同。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部