Python9-装饰器进阶-day12

wapers方法

def wahaha():
    '''
    sljfldsjflds
    :return:
    '''
    print('娃哈哈')
print(wahaha.__name__)  #查看字符串格式的函数名
from functools import wraps
def wrapper(func):  #func = login
    @wraps(func)
    def innner(*args,**kwargs):
        print('在被装饰的函数执行前做的事')
        ret = func(*args,**kwargs)
        print('在被装饰的函数执行后做的事')
        return ret
    return innner
@wrapper      #login = wrapper(login)
def login(day):
    '''这是一个放假通知'''
    print('全体放假%s'%day)
    return '好开心'
print(login.__name__)
print(login.__doc__)
ret = login(3)   #inner
print(ret)

login
这是一个放假通知
在被装饰的函数执行前做的事
全体放假3
在被装饰的函数执行后做的事
好开心

 装饰器进阶_带参数的装饰器

import time
FLAG = True
def timmer_out(FLAG):
    def timmer(func):
        def inner(*args,**kwargs):
            if FLAG:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end - start)
                return ret
            else:
                ret = func(*args,**kwargs)
                return ret
        return inner
    return timmer
@timmer_out(FLAG)
def wahaha():
    time.sleep(0.1)
    print('hahahahahaha')
#@timer = timer_out(FLAG)
@timmer_out(FLAG)
def erguotou():
    time.sleep(0.2)
    print('erguotoutotutou')

wahaha()
erguotou()

hahahahahaha
0.1000058650970459
erguotoutotutou
0.2000112533569336

 
import time
FLAG = False
def timmer_out(FLAG):
    def timmer(func):
        def inner(*args,**kwargs):
            if FLAG:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end - start)
                return ret
            else:
                ret = func(*args,**kwargs)
                return ret
        return inner
    return timmer
@timmer_out(FLAG)
def wahaha():
    time.sleep(0.1)
    print('hahahahahaha')
#@timer = timer_out(FLAG)
@timmer_out(FLAG)
def erguotou():
    time.sleep(0.2)
    print('erguotoutotutou')

wahaha()
erguotou()


hahahahahaha
erguotoutotutou

#多个装饰器装饰一个函数

def wrapper1(func):
    def innner1(*args,**kwargs):
        print('wrapper,before func')
        func()
        print('wrapper,after func')
    return innner1
def wrapper2(func):
    def innner2(*args,**kwargs):
        print('wrapper,before func')
        func()
        print('wrapper,after func')
    return innner2
@wrapper2
@wrapper1
def f():
    print('##########333')
f()


wrapper,before func
wrapper,before func
##########333
wrapper,after func
wrapper,after func
####################################
from functools import wraps
def wrapper1(func): #func --->f
def innner1(*args,**kwargs):
print('wrapper1,before func')
func() #f
print('wrapper1,after func')
return innner1
def wrapper2(func): #func --->inner1
def innner2(*args,**kwargs):
print('wrapper2,before func')
func() #inner1
print('wrapper2,after func')
return innner2
@wrapper2 #f=wrapper2(f) === wrapper(inner1) ===inner2
@wrapper1 #f=wrapper1(f) ==inner1 函数最近的装饰器先执行
def f():
print('##########333')
f() #-----》inner2()
 

 

 三层嵌套

from functools import wraps
def wrapper1(func):  #func --->f
    def innner1(*args,**kwargs):
        print('wrapper1,before func')
        func()   #f
        print('wrapper1,after func')
    return innner1
def wrapper2(func):   #func --->inner1
    def innner2(*args,**kwargs):
        print('wrapper2,before func')
        func()   #inner1
        print('wrapper2,after func')
    return innner2
def wrapper3(func):   #func --->inner1
    def innner3(*args,**kwargs):
        print('wrapper3,before func')
        func()   #inner1
        print('wrapper3,after func')
    return innner3
@wrapper3
@wrapper2    #f=wrapper2(f)  === wrapper(inner1)  ===inner2
@wrapper1   #f=wrapper1(f)  ==inner1   函数最近的装饰器先执行
def f():
    print('##########333')
f()    #-----》inner2()


wrapper3,before func
wrapper2,before func
wrapper1,before func
##########333
wrapper1,after func
wrapper2,after func
wrapper3,after func

 带返回值的多装饰器装饰函数

def wrapper1(func):  #func --->f
    def innner1(*args,**kwargs):
        print('wrapper1,before func')
        ret = func()   #f
        print('wrapper1,after func')
        return ret
    return innner1
def wrapper2(func):   #func --->inner1
    def innner2(*args,**kwargs):
        print('wrapper2,before func')
        ret = func()   #inner1
        print('wrapper2,after func')
        return ret
    return innner2
def wrapper3(func):   #func --->inner1
    def innner3(*args,**kwargs):
        print('wrapper3,before func')
        ret = func()   #inner1
        print('wrapper3,after func')
        return ret
    return innner3
@wrapper3
@wrapper2    #f=wrapper2(f)  === wrapper(inner1)  ===inner2
@wrapper1   #f=wrapper1(f)  ==inner1   函数最近的装饰器先执行
def f():
    print('##########333')
    return 'hahahah'
print(f())   #-----》inner2()

wrapper3,before func
wrapper2,before func
wrapper1,before func
##########333
wrapper1,after func
wrapper2,after func
wrapper3,after func
hahahah

 
原文地址:https://www.cnblogs.com/zhangtengccie/p/10322880.html