装饰器函数

内容目录                

装饰器的形成过程      

开放封闭原则        

装饰器的固定模式      

多个装饰器修饰一个函数   

 

装饰器的形成过程    

import time
def wrapper(func):
    def inner():
        start = time.time()
        time.sleep(1)
        func()
        end = time.time()
        print(end-start)
    return inner

def fon():
    print('这个函数运行了多长时间')
fon = wrapper(fon)
fon()
# 这个函数运行了多长时间
# 1.0005815029144287
装饰器简版
import time
def wrapper(func):
    def inner():
        start = time.time()
        time.sleep(1)
        func()
        end = time.time()
        print(end-start)
    return inner

@wrapper  # fon = wrapper(fon)
def fon():
    print('这个函数运行了多长时间')
fon()
# 这个函数运行了多长时间
# 1.0002448558807373
语法糖
import time
def wrapper(func):
    def inner(a):
        start = time.time()
        time.sleep(1)
        func(a)
        end = time.time()
        print(end-start)
    return inner

@wrapper  # fon = wrapper(fon)
def fon(a):
    print(a)
fon('加入的参数') 
# 加入的参数
# 1.0004477500915527
带参数的装饰器

 

# 带参数的装饰器 --> 一个变量控制多个函数
def fon(flag):
    def wrapper(f):
        def inner(*args,**kwargs):
            if flag:
              print('函数执行前添加的操作')
            ret = f(*args,**kwargs)
            if flag:
              print('函数执行后添加的操作')
            return ret
        return inner
    return wrapper

@fon(True)
def func(a):
    print(a)
func('1')
# 函数执行前添加的操作
# 1
# 函数执行后添加的操作
带参数的装饰器,一个变量控制多个函数

 

 

开放封闭原则      

开放封闭原则 1.对扩展是开放的 2.对修改是封闭的

 

装饰器的固定模式    

#可以hold住传入的不同参数的函数
#可以打印返回值
def wrapper(f):
    def inner(*args,**kwargs):
        print('函数执行前可以的添加操作')
        ret = f(*args,**kwargs)
        print('函数执行后可以的添加操作')
        return ret
    return inner
@wrapper
def func(a,b):
    return a if a>b else b
print(func(1,2))
# 函数执行前可以的添加操作
# 函数执行后可以的添加操作
# 2
View Code
def index():
    '''这是一个主页信息'''
    print('from index')

print(index.__doc__)   #查看函数注释的方法
print(index.__name__)  #查看函数名的方法
#这是一个主页信息
#index
查看装饰器的方法名

 

多个装饰器修饰一个函数 

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()
# wrapper2 ,before func
# wrapper1 ,before func
# in f
# wrapper1 ,after func
# wrapper2 ,after func
#输出结果顺序 --> 俄罗斯套娃
View Code

 

posted @ 2019-09-03 21:21  supreme_me  阅读(90)  评论(0)    收藏  举报