修饰器-py

本文介绍了一种使用Python装饰器来记录函数运行时间的方法。通过简单的装饰器实现,可以方便地为任何函数添加时间统计的功能。

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

1.装饰器-打印method打印时间的简短装饰器:

import datetime
from functools import wraps

def runTimeFunc_args(args):
    def func_wrapper(func):
        @wraps(func)
        def return_wrapper(*callvarargs, **callkeywords):
            starttime = datetime.datetime.now()
            func_result = func(*callvarargs, **callkeywords)
            endtime = datetime.datetime.now()
            print "method:%s runTimesTotal: %f s" % (args,(endtime - starttime).seconds)
            return func_result
        return return_wrapper
    return func_wrapper

### Python 裚器 使用指南 Python装饰器是一种强大的功能,能够用来修改、增强或者包装其他函数或类的行为[^1]。通过使用装饰器,我们可以实现代码的复用以及功能的扩展。 #### 基本概念 装饰器本质上是一个接受函数作为输入并返回新函数的对象。它允许我们在不改变原函数定义的情况下为其添加额外的功能。以下是装饰器的一个简单例子: ```python def my_decorator(func): def wrapper(): print("调用前的操作") func() print("调用后的操作") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() ``` 在这个例子中,`say_hello()` 函数被 `my_decorator` 所装饰,在其前后分别打印了消息。 #### 处理带参数的函数 如果要装饰带有参数的函数,则需要调整内部的 `wrapper` 函数来接收这些参数: ```python def my_decorator(func): def wrapper(*args, **kwargs): print("调用前的操作") result = func(*args, **kwargs) print("调用后的操作") return result return wrapper @my_decorator def greet(name): print(f"Hello, {name}!") greet("Alice") ``` 这里展示了如何让装饰器支持任意数量的位置参数 (`*args`) 和关键字参数 (`**kwargs`)[^1]。 #### 嵌套装饰器 当一个函数可以被多个装饰器修饰时,装饰器会按照从内到外的顺序依次执行[^3]。下面的例子说明了这一点: ```python def decorator1(func): def wrapper(): print("装饰器1") func() return wrapper def decorator2(func): def wrapper(): print("装饰器2") func() return wrapper @decorator1 @decorator2 def say_hello(): print("Hello, World!") say_hello() ``` 运行这段代码将会先看到 “装饰器1”,接着是 “装饰器2”,最后才是实际的消息输出[^3]。 #### 避免常见错误 在编写带有参数的装饰器时容易犯错,比如忘记返回真正的包裹函数。例如下述情况就是一种典型陷阱[^4]: ```python def decorator_with_args(arg): def decorator(func): print(f"装饰器参数: {arg}") return func() # 错误:应该返回一个新的函数而不是立即调用原始函数 return decorator @decorator_with_args("参数值") def my_function(): print("函数逻辑") my_function() ``` 正确的做法应该是这样设计装饰器结构以确保每次都能正常工作: ```python from functools import wraps def decorator_with_args(arg): def actual_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print(f"装饰器参数: {arg}") return func(*args, **kwargs) return wrapper return actual_decorator @decorator_with_args("参数值") def my_function(): print("函数逻辑") my_function() ``` 此版本利用了标准库模块 `functools.wraps` 来保持元数据一致性,并且正确处理了有参装饰器的情况[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值