装饰器简单例子

装饰器简单例子,为了给一个方法week加上计时器,新写一个方法count_time,然后count_time方法里定义wrapper方法,返回这个wrapper,这样原方法week就有了计时功能

def week():
    print(1)
def count_time(func):
    def wrapper():
        t1 = time.time()
        func()
        print("执行时间为:", time.time() - t1)
 
    return wrapper# 返回函数才可以让原来的函数还是函数,不然的话没法调用,只是方法改写

week = count_time(week)
### 什么是Python装饰器Python装饰器是一种特殊的函数,它允许在不修改被装饰函数源代码的前提下,为其添加额外的功能。装饰器本质上是一个函数,其返回值也是一个函数对象,这种特性使其非常适合用于处理切面需求,例如:插入日志、性能测试、事务处理、缓存、权限校验等场景[^1]。 装饰器的工作方式是通过将被装饰的函数作为参数传递给装饰器函数,并返回一个新的函数对象来替代原始函数。当使用`@decorator`语法时,Python解释器会自动完成这一过程,使得装饰器的使用对开发者透明[^2]。 例如,一个简单装饰器可以定义如下: ```python def simple_decorator(func): def wrapper(*args, **kwargs): print("Before function call") result = func(*args, **kwargs) print("After function call") return result return wrapper @simple_decorator def say_hello(): print("Hello") say_hello() ``` 在这个例子中,`say_hello`函数被`simple_decorator`修饰。当调用`say_hello()`时,实际上是调用了由装饰器返回的新函数`wrapper`,这使得在调用原函数之前和之后可以执行一些额外的操作,例如打印日志[^2]。 除了函数装饰器Python还支持类装饰器。类装饰器通常用于需要维护状态的情况。类装饰器可以通过定义一个包含`__call__`方法的类来实现。当一个类作为装饰器时,它的实例会被创建,并且这个实例会被用来调用被装饰的函数[^2]。 例如: ```python class MyDecorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print("Before function call") result = self.func(*args, **kwargs) print("After function call") return result @MyDecorator def say_hello(name): print(f"Hello, {name}") say_hello("World") ``` 在上述代码中,`MyDecorator`是一个类装饰器,它在调用被装饰的函数前后打印消息。当`say_hello`被调用时,实际上是调用了`MyDecorator`实例的`__call__`方法[^2]。 ### 装饰器的参数传递 装饰器需要能够处理任意数量和类型的参数。通常通过在内部函数中使用`*args`和`**kwargs`来实现这一点。这样装饰器就可以正确地传递这些参数给被装饰的函数[^2]。 例如,一个带有参数的装饰器可以定义如下: ```python def logger(level): def decorator(func): def wrapper(*args, **kwargs): print(f"[{level}] Before function call") result = func(*args, **kwargs) print(f"[{level}] After function call") return result return wrapper return decorator @logger(level='DEBUG') def greet(name): print(f"Hello, {name}") greet("World") ``` 在这个例子中,`greet`函数被`logger`装饰器修饰,而`logger`是一个带有参数的装饰器。它首先接收参数`level`,然后返回一个真正的装饰器函数,该函数再返回一个包装函数`wrapper`,从而实现对函数调用前后的行为控制[^2]。 ### 多个装饰器的应用 当一个函数被多个装饰器修饰时,装饰器的执行顺序是从下往上的。这意味着,最靠近函数定义的装饰器会最先被应用。 例如: ```python def decorator1(func): def wrapper(*args, **kwargs): print("Decorator 1 before") result = func(*args, **kwargs) print("Decorator 1 after") return result return wrapper def decorator2(func): def wrapper(*args, **kwargs): print("Decorator 2 before") result = func(*args, **kwargs) print("Decorator 2 after") return result return wrapper @decorator1 @decorator2 def say_hello(): print("Hello") say_hello() ``` 在这个例子中,`say_hello`函数被`decorator2`和`decorator1`修饰。装饰过程等价于`decorator1(decorator2(say_hello))`,因此`decorator2`会先被应用,然后是`decorator1`。 ### 总结 装饰器Python中一个非常强大的特性,它允许程序员在不修改原有代码的情况下扩展功能。无论是简单的函数装饰器还是复杂的类装饰器,都能极大地提高代码的复用性和可读性。通过理解和掌握装饰器的使用方法和工作原理,开发者可以编写出更加优雅和高效的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值