装饰器模式:原来一直都在用

装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要使用子类来扩展功能。装饰器模式通过创建一个包装类来包裹原始类,然后在包装类中提供额外的功能,从而实现功能的动态添加,同时也遵循了开闭原则。

在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}")

查看原文:装饰器模式:原来一直都在用

关注公众号 "字节航海家" 及时获取最新内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值