装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要使用子类来扩展功能。装饰器模式通过创建一个包装类来包裹原始类,然后在包装类中提供额外的功能,从而实现功能的动态添加,同时也遵循了开闭原则。
在Python中,装饰器通常是一个函数,它接受一个函数作为参数,并返回一个新的函数,这个新的函数在调用原始函数之前或之后执行一些额外的操作。装饰器可以用来添加日志记录、性能测试、缓存等功能,而不需要修改原始函数的代码。
函数装饰器
下面是一个实际常用的Python案例,使用装饰器模式实现一个简单的日志记录功能:
def log(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")
return func(*args, **kwargs)
return wrapper
@log
def add(x, y):
return x + y
result = add(1, 2)
print(f"Result: {result}")
# 带参数的函数装饰器
def log(level):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"[{level}] Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")
return func(*args, **kwargs)
return wrapper
return decorator
@log(level="INFO")
def add(x, y):
return x + y
result = add(1, 2)
print(f"Result: {result}")
类装饰器
当我们使用类装饰器时,我们定义一个类来作为装饰器,这个类必须实现 __init__ 和 __call__ 方法。__init__ 方法用于接收参数并初始化装饰器状态,__call__ 方法用于实现装饰逻辑。
以下是一个使用类装饰器的例子,实现一个简单的日志记录功能:
class LogDecorator:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print(f"Calling function {self.func.__name__} with args: {args}, kwargs: {kwargs}")
return self.func(*args, **kwargs)
@LogDecorator
def add(x, y):
return x + y
result = add(1, 2)
print(f"Result: {result}")
# 带参数的类装饰器
class LogDecorator:
def __init__(self, level):
self.level = level
def __call__(self, func):
def wrapper(*args, **kwargs):
print(f"[{self.level}] Calling function {func.__name__} with args: {args}, kwargs: {kwargs}")
return func(*args, **kwargs)
return wrapper
@LogDecorator(level="INFO")
def add(x, y):
return x + y
result = add(1, 2)
print(f"Result: {result}")
查看原文:装饰器模式:原来一直都在用
关注公众号 "字节航海家" 及时获取最新内容