day12 装饰器进阶

本节主要内容:

1通用装饰回顾

2函数的有用信息

3带参数的装饰器

4多个装饰器同时装饰一个函数

一 通用装饰器的回顾

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

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

通用装饰器的写法

def warpper(fn):
    def inner(*args,**kwargs):
        """执行前的"""
        ret=fn(*args,**kwargs)#接受
        """在目标函数执行之后"""
        return  ret
    return inner
@warpper  
def fun():
    print("我要学python")
fun()

 执行过程:

1程序从上自下,当执行到@warpperd的时候,吧函数作为参数传递给warpper函数,得到inner函数,重新赋值给fun

2挡执行到fun的时候我们实际上执行的是inner函数,inner函数会执行目标函数之前的代码,然后在执行你的目标函数,执行完目标函数最后执行的是目标函数之后的代码

二 函数的有用信息

1如何给函数添加注释

def chi(food,drink):
    """这里是函数的注释,先写一下这个函数是做什么的",比如我这个函数
    就是一个吃:param foood; 参数food是什么意思?"
    param drink;参数drink是什么意思"
    return返回的什么东西"""
    print(food,drink)
    return  "very good"
    print(chi.__doc__)
    print(chi.__name__)
chi("吃嘛嘛香","我不想出")
print(chi.__doc__)  #获取函数的注释
print(chi.__name__)  #获取函数的名字

  from functools import wraps

  @wrap(fn)  吧你的函数的名字和doc换成你的 目标函数

from functools import wraps
def wrapper(fn):
    @wraps(fn)  #这个代码的作用吧inner的__name__,__doc__换成fn 的
    def  inner(*args,**kwargs):
        print("我是前面")
        ret=fn(*args,**kwargs)
        print("我是后面")
        return ret
    return  inner
@wrapper
def func():
    print("我是func")
func()

 2回顾装饰器

还是原先的那串代码

3带参数的装饰器

 

from functools import  wraps
def wrapper(fn):
    @wraps(fn)
    def inner(*args,**kwargs):
        print("问问金老板怎么样啊")
        ret=fn(*args,**kwargs)
        print("艹,金老板骗我")
        return ret
    return inner
@wrapper
def fun():
    print("约一约")
fun()

  给上层函数装一个开关需要的时候就问金老板 如果不要紧就不问了改如何实现?

from functools import  wraps
def wrapper__out(flag):
    def wrapper(fn):
        @wraps(fn)
        def inner(*args,**kwargs):
            if flag==True:
                print("问问金老板怎么样啊")
                ret=fn(*args,**kwargs)
                print("艹,金老板骗我")
                return ret
            else:
                ret=fn(*args,**kwargs)
                return ret
        return inner
    return wrapper
@wrapper__out(True) #传递True和False来控制装饰器内部的运行效果
def fun():
    print("约一约")
fun()

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

def wrapper1(fn):
    def inner(*args,**kwargs):
        print("我要烧香")
        ret=fn(*args,**kwargs)
        print("熊猫烧香")
        return ret
    return  inner
def wrapper2(fn):
    def inner(*args,**kwargs):
        print("大哥烧香")
        ret=fn(*args,**kwargs)
        print("徐阳烧香")
        return ret
    return inner
@wrapper1
@wrapper2
def func():
    print("我是func")
func()

  

 

posted @ 2018-06-15 16:37  山东张铭恩  阅读(108)  评论(0编辑  收藏  举报