装饰器

函数初识:
函数名的命名规则:和变量相同===1:数字、字母、下划线任意组合,不能使用空格、连字符、标点符号、引号或其他字符。==》不能是中文,也不能以数字开头
    2:不可以是Python中的关键字
    3:也不能随意起名,要具有可描述性,
    4:长度没有限制,但是也不应太过冗长
    5:可以使用官方推荐的字体:驼峰体,下划线体
    
def caculate(a,b):    # def关键字:definition + 函数名    # 注意:函数要有返回值
    res = a+b
    return res
    

函数:
本质:封装一个功能
作用/优点:
    重复代码少,可读性强,复用性强
执行顺序:
    代码从上到下执行的过程中遇到函数时只读取函数名,但是并不执行函数内的程序,而是被调用时才执行


    
    
装饰器初识:
作用/功能:在不改变原函数名的情况下,为函数增添额外的功能
import functools

def wrapper(func):
    @functools.wraps(func)    # functools.wraps()作用:保留原函数的信息,将装饰器伪装的更像原函数
    def inner(*args,**kwargs):
        """被装饰之前"""
        ret = func(*args,**kwargs)
        """被装饰之后"""
        return ret
    def inner
    


@wrapper
def func(*args,**kwargs):    # 在函数定义时/形参阶段:*args,**kwargs接收所有参数:*arg会把多出来的位置参数转化为tuple;**kwarg会把关键字参数转化为dict
    print("我是func")
    flag = True
    return flag
    
func(*args,**kwargs)    
    
###########################################################




多个装饰器装饰一个函数
def wrapper1(f):  # f == func,传进来的函数名
    def inner1(*args,**kwargs):
        """被装饰之前"""
        print('wrapper1 ,before func')     # 3
        f()                                # 4
        """被装饰之后"""
        print('wrapper1 ,after func')      # 5
    return inner1


def wrapper2(f):  # f == inner1
    def inner2(*args,**kwargs):
        print('wrapper2 ,before func')  # 2
        f()
        print('wrapper2 ,after func')      # 6
    return inner2


def wrapper3(f):      # f==inner2
    def inner3(*args,**kwargs):
        print('wrapper3 ,before func')  # 1
        f()                          
        print('wrapper3 ,after func')   # 7
    return inner3


@wrapper3  # f = wrapper3(func)  ==>f = wrapper3(inner2)==>里面的func == inner2  外面的func == inner3
@wrapper2  # f = wrapper2(func)  ==>f = wrapper2(inner1)==>里面的func == inner1  外面的func == inner2
@wrapper1  # f = wrapper1(func)  ==>f = wrapper(func)里面的func == 函数名func  外面的func == inner1
def func():        
    print('i am in func')
    flag = True
    return flag

f()  


"""
wrapper3 ,before func
wrapper2 ,before func
wrapper1 ,before func
i am in func
wrapper1 ,after func
wrapper2 ,after func
wrapper3 ,after func
"""



##############################################
带参数的装饰器==>三层函数嵌套
def timmer(*args,**kwargs):
    def wrapper(f):                    # f == func1
        def inner(*args,**kwargs):
           """被装饰之前"""
           ret = f(*args,**kwargs)    # 执行函数func1并得到结果
           """被装饰之后"""
           return ret
        return inner
    return wrapper


@timmer(*args,**kwargs)  # 两步:1,函数名加括号==》执行该函数,timmer(*args,**kwargs) --> wrapper 2,@wrapper 装饰器==>wrapper(func1)
def func1():
    print("执行函数func1")


@timmer(*args,**kwargs)
def func2():
    print("执行函数func2")
    flag = True
    return flag
    
    
func1()
func2()

 

posted @ 2018-10-09 18:00  你有我搞笑吗  阅读(140)  评论(0编辑  收藏  举报