day12--装饰器进阶

一,通用装饰器的回顾

开闭原则:对增加功能开放,对修改代码封闭

装饰器的作用:在不改变原有代码的基础上给函数增加功能.

写法:

def wrapper(fn):

  def inner(*args,**kwargs):

    "目标函数之前要做什么"

    ret = fn(*args,**kwargs)

    "目标函数之后要做什么"

    return ret

  return inner

@wrapper

def target_func():

  "目标函数体"

target_func()

执行过程:1,程序从上往下执行,当执行到@wrapper的时候,把函数作为参数传递给wrapper函数,得到inner函数,重新赋值给target_func

2,当执行到target_func的时候,我们实际上执行的事inner函数,inner函数会先执行目标函数之前的代码,然后再执行你的目标函数,执行完目标函数最后执行的事目标函数之后的代码

二,函数的有用信息

1,给函数添加注释

2,获取函数的相关信息

函数名.__name__可以查看函数的名字

函数名.__doc__ 可以查看函数的文档注释

def chi(food,drink):
    '''
    
    :param food:  参数food是什么意思
    :param drink:  参数drink是什么意思
    :return:   返回的是什么
    '''
    print(food,drink)
  
print(chi.__doc__) #获取函数的文档注释
print(chi.__name__) #获取到函数名
    return "very good" 

print("西瓜","桃子")

PS:  *args  **kwargs什么时候打散,什么时候聚合

1,接收函数的时候是聚合,声明参数

2,传递参数的时候是打散,给函数传递实参

三,装饰器传参

from  functools import wraps
def wrapper_out(flag):
    def wrapper(fn):
        @wraps(fn)
        def inner(*args,**kwargs):
            if flag == True:     #查的严,需要问一下
                print("问问金老板")
                ret = fn()
                print("金老板骗我")
                return ret
            else:          #查的不严,不用问了
                ret = fn(*args,**kwargs)
                return ret
        return inner
    return wrapper
@wrapper_out(True)   #传递True和False来控制装饰器的内部运行效果
def yue():
    print("哈哈")
yue()

执行步骤:先执行wrapper(True),然后再@返回值,返回值恰好是wrapper,结果就是@wrapper

四,多个装饰器装饰同一个函数

def wrapper1(fn):
    def inner(*args,**kwargs):
        print("111")
        ret = fn(*args,**kwargs)
        print("222")
        return ret
    return inner

def wrapper2(fn):
    def inner(*args,**kwargs):
        print("333")
        ret = fn(*args,**kwargs)
        print("444")
        return ret
    return inner

@wrapper2
@wrapper1
def eat():
    print("我想吃水果")

eat()
# 333
# 111
# 我想吃水果
# 222
# 444

{ [ ( ) ] }  从左往右执行

猜你喜欢

转载自www.cnblogs.com/lianghui-lianghui/p/9203989.html