Python-decorator

Python-装饰器

  1. 为什么要用装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.

    概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

  2. 装饰器

    def debug(func):
        def wrapper():
            print("[DEBUG]: enter {}()".format(func.__name__))
            return func()
        return wrapper
    
    @debug
    def addUser():
        print('添加用户成功!')
        return 'ok'
    
    @debug
    def registUser():
        print('添加用户成功!')
    
  3. 装饰器传参

    参数先传给装饰器,装饰器传给函数

    def debug(func):
        def wrapper(name):
            print("[DEBUG]: enter {}()".format(func.__name__))
            func(name)
        return wrapper
    
    @debug
    def addUser(name):
        print('添加用户{0}成功!'.format(name))
    
    @debug
        def registUser(name):
            print('添加用户{0}成功!'.format(name))
    
    addUser('tom')
    registUser('jack')
    

    如果函数是有返回值的,则加上return 语句即可

    def debug(func):
        def wrapper(name):
            print("[DEBUG]: enter {}()".format(func.__name__))
            return func(name)  #此处加上return
        return wrapper
    
  4. 传递可变参数

    def debug(func):
        def wrapper(*args,**other):
            print("[DEBUG]: enter {}()".format(func.__name__))
            print(other)
             # 可以在此处对 args和other数据进行处理
            return func(args)
        return wrapper
    
    @debug
    def addUser(user):
        print('添加用户{0}成功!'.format(user))
        return user
    
    @debug
    def registUser(user):
        print('添加用户{0}成功!'.format(user))
        return user
    
    n1=addUser('tom',12,other={'gender': 'M', 'job': 'Engineer'})
    n2=registUser('jack')
    
  5. functools模块

    1. 不带参数
    from functools import wraps
        def debug(func):
            @wraps(func)
            def wrapper(name):
                print("[DEBUG]: enter {}()".format(func.__name__))
                return func(name)  #此处加上return
            return wrapper
    
    @debug
    def show(s):
        print(s)
    
    show('ppyth')
    
    1. 带参数
    from functools import wraps
        def debug(*text):
            def decorated(func):
                @wraps(func)
                def wrapper(name):
                    print("[DEBUG]: enter {}()".format(func.__name__))
                    return func(name)  # 此处加上return
                return wrapper
        return decorated
    
    @debug()  #此处的()不可以删略
    def show(s):
        print(s)
    show('ppyth')
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值