装饰器

#对于不可变的数据类型 如果在函数内部修改想对全局生效,就要进行global声明

a = 10
def func():
    global a
    a = 20

print(a)
func()
print(a)

 


#对于可变的数据类型 如果在内部想要修改,直接修改即可

a = {'k':'v'}
def func():
    #a['k'] = 'vvvvvv'
    a = {'k':'vvvvvv'}
    print(a)

func()
print(a)

装饰器的固定格式

def wrapper(func): #wrapper装饰器的名字
    def inner(*args,**kwargs):
        #print('被装饰的函数执行之前你要做的事儿')
        print('你正在调用%s函数'%func.__name__)
        ret = func(*args,**kwargs)   #被装饰的函数
        #print('被装饰的函数执行之后你要做的事儿')
        return ret
    return inner

 

开放封闭原则
#开放 对扩展是开放的
#封闭 对修改是封闭的

 

添加一个函数运行计时功能

    import time
def timmer(func):   #装饰器
    def inner(*args,**kwargs):
        start = time.time()
        ret = func(*args,**kwargs)   #qqxing(a)
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer #qqxing = timmer(qqxing)   #语法糖
def qqxing(num,num2):   #被装饰的函数
    for i in range(10000000):pass
    print('老板万岁')
    return num+num2
#对于用户来讲 你感知不到装饰器的存在  在一个函数的前后添加功能
ret = qqxing(1,2)   #inner(1)
print(ret)  #123

带参数的装饰器:

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()

多个装饰器装饰一个函数

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()

 

posted @ 2017-09-02 14:15  mendax  阅读(59)  评论(0)    收藏  举报