Python中装饰器的理解和实现

本文介绍了装饰器,它是callable object,能让其他函数在不改动代码时增加额外功能,返回值是函数对象。其应用场景包括插入日志、性能测试等,可抽离无关雷同代码。还给出带定长参数、不定长参数装饰器及计时器装饰器的示例。

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

装饰器的简单理解:

装饰器本质上是一个callable object,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。

装饰器的应用场景:

装饰器的返回值也是一个函数的对象,它经常用于以下的场景。比如:插入日志,性能测试,事务处理,缓存。权限的校验等场景,有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。

举例1:

编写一个带定长参数的装饰器:

def new_func(func):
    def wrappedfun(username, passwd):
        if username == 'root' and passwd == '123456789':
            print('通过认证')
            print('开始执行附加功能')
            return func()
       	else:
            print('用户名或密码错误')
            return
    return wrappedfun

@new_func
def origin():
    print('开始执行函数')
origin('root','123456789')

运行结果:

通过认证
开始执行附加功能
开始执行函数

举例2:

带不定长参数的装饰器

def new_func(func):
    def wrappedfun(*parts):
        if parts:
            counts = len(parts)
            print('本系统包含 ', end='')
            for part in parts:
                print(part, ' ',end='')
            print('等', counts, '部分')
            return func()
        else:
            print('用户名或密码错误')
            return func()
    return wrappedfun

举例3:

写出一个计时器记录方法执行性能的装饰器

import time
from functools import wraps
def time_this_function(func):
    #作为装饰器使用,返回函数执行需要花费的时间
    @wraps(func)
    def wrapper(*args,**kwargs):
        start=time.time()
        result=func(*args,**kwargs)
        end=time.time()
        print(func.__name__,end-start)
        return result
    return wrapper
if __name__=='__main__':
    @time_this_function
    def count_number(n):
        while n>0:
            time.sleep(0.1)
            n+=-1
    count_number(10)

运行结果:

count_number 1.0461959838867188

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值