Python装饰器

Posted on 2017-12-26 08:47  阿骏骏  阅读(166)  评论(0编辑  收藏  举报
装饰器:
定义:本身是函数,用来装饰其他函数,为其他函数添加附加功能
原则:1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式

实现装饰器知识储备
1、函数即“变量”
2、高阶函数
  定义:
  1)函数接收的参数是一个函数名
  2)函数的返回值是一个函数名
  3)满足上述条件的任意一个,都可称之为高阶函数
  总结
1)把一个函数名当作实参传给另外一个函数
    作用:在不修改被装饰函数源代码的情况下为其添加功能
    不足:会改变函数的调用方式
2)返回值中包含函数名
    作用:不修改函数的调用方式
    不足:不能添加新功能
#一个最简单的高阶函数:

def add(x, y, f):
    return f(x) + f(y)
'''
当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函#数定义,我们可以推导计算过程为:

x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return 11
用代码验证一下:
'''
def add(x, y, f):
    return f(x) + f(y)

print(add(-5, 6, abs))
一个最简单的高阶函数
def foo():
    print('我的函数名作为参数传给高阶函数')
def gao_jie1(func):
    print('我就是高阶函数1,我接收的参数名是%s' %func)
    func()

def gao_jie2(func):
    print('我就是高阶函数2,我的返回值是%s' %func)
    return func

gao_jie1(foo)
gao_jie2(foo)
高阶函数示范2
#高阶函数应用1:把函数当做参数传给高阶函数
import time
def foo():
    print('from the foo')

def timmer(func):
    start_time=time.time()
    func()
    stop_time=time.time()
    print('函数%s 运行时间是%s' %(func,stop_time-start_time))
timmer(foo)
#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式
把函数当做参数传给高阶函数
#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名
import time
def foo():
    print('from the foo')

def timmer(func):
    start_time=time.time()
    return func
    stop_time=time.time()
    print('函数%s 运行时间是%s' %(func,stop_time-start_time))
foo=timmer(foo)
foo()
#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
把函数名当做参数传给高阶函数,高阶函数直接返回函数名
3、嵌套函数

高阶函数+嵌套函数=》装饰器

#函数的调用和嵌套
def foo():
    print('in the foo')
    bar() #此处只是函数的调用,如果有def定义,则是函数的嵌套

def bar():
    print('in the bar')

foo()

#装饰器代码
def timer(func):
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print('the func run time is %s'%(stop_time-start_time))
    return deco
@timer #等同于func1 = timer(func1)
def func1():
    time.sleep(3)
    print('in the func1')
@timer
def func2():
    time.sleep(3)
    print('in the func2')

# deco(func1)
# deco(func2)

#func1 = timer(func1)
func1()
func2()

 

 

Copyright © 2024 阿骏骏
Powered by .NET 8.0 on Kubernetes