Python修饰器(带参数的修饰器)

本文介绍Python装饰器的基本概念,包括不带参数及带参数的装饰器实现方式,并通过实例演示了如何使用装饰器来增强函数的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def deco(func):
    def wrapper(*arg, **kw):
        print('decorator arg: %s' % arg_of_decorator)
        print('call %s in decorator' % func.__name__)
        return func(*arg, **kw)
    return wrapper

@deco
def test():
    pass

#等价于 test=deco(test),即在@修饰器名称后直接加(被修饰的函数名)
#因此,带参数的修饰器可以如下实现:


def decorator(arg_of_decorator):
    def deco(func):
        def wrapper(*arg, **kw):
            print('decorator arg: %s' % arg_of_decorator)
            print('call %s in decorator' % func.__name__)
            return func(*arg, **kw)
        return wrapper
    return deco


@decorator("修饰器参数")
def test1():
    pass
#等价于 test1 = decorator("修饰器参数")(test1) = deco(test1)
#修饰器的参数已经传递进去


### Python装饰器的概念 Python装饰器是一种用于修改或增强函数或方法行为的高级特性。本质上,装饰器是一个接受函数作为参数并返回新函数的对象。这种方式允许在不改变原函数代码的前提下为其添加额外的功能[^1]。 ### 装饰器的定义与语法 #### 函数装饰器 最简单的形式如下所示: ```python def decorator_function(original_func): def wrapper(*args, **kwargs): print("执行前的操作") result = original_func(*args, **kwargs) print("执行后的操作") return result return wrapper @decorator_function def greet(name): print(f"你好, {name}") greet("Alice") # 输出: 执行前的操作\n你好, Alice\n执行后的操作 ``` 上述例子展示了如何创建一个基本的装饰器`decorato r_function`来包裹原始函数`greet()`,从而在其调用前后打印消息[^2]。 #### 类装饰器 除了可以用来修饰普通函数外,还可以利用装饰器来处理整个类的行为: ```python class DecoratorClass: def __init__(self, cls): self.cls = cls def __call__(self, *args, **kwargs): instance = self.cls(*args, **kwargs) setattr(instance, 'extra_method', lambda : "这是新增的方法") return instance @DecoratorClass class MyClass: def my_original_method(self): return "我是原有的方法" obj = MyClass() print(obj.my_original_method()) # 输出: 我是原有的方法 print(obj.extra_method()) # 输出: 这是新增的方法 ``` 这段代码说明了怎样通过自定义的`DecoratorClass`向被装饰的目标类动态注入成员属性或方法。 ### 应用场景举例 - 日志记录:可以在进入/退出某个特定逻辑单元时自动写入日志条目; - 性能测量:计算一段程序运行所需时间; - 权限验证:确保只有授权用户才能访问某些资源; - 缓存机制:保存昂贵运算的结果以便后续快速检索; 掌握这些技巧有助于编写更加优雅高效的Python应用程序[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值