【Python基础】装饰器

详解Python装饰器

阅读目录

一、什么是装饰器

器即函数

装饰即修饰,意指为其他函数添加新功能

装饰器定义:本质就是函数,功能是为其他函数添加新功能

二 、装饰器需要遵循的原则

1、不修改被装饰函数的源代码(开放封闭原则)

2、为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三、实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

四、高阶函数

高阶函数定义:

  1、函数接收的参数是一个函数名

  2、函数的返回值是一个函数名

  3、满足上述条件任意一个,都可称之为高阶函数

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)
高阶函数示范
#高阶函数应用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增加任何新功能
函数返回值是函数名

高阶函数总结

1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

五、函数嵌套

def father(name):
    print('from father %s' %name)
    def son():
        print('from son')
        def grandson():
            print('from grandson')
        grandson()
    son()

father('熊大')

#在father 函数里面再定义son 函数 叫做函数嵌套
# def father(name):
#     print('from father %s' %name)
#     def son():
#         print('from son')
#     print(locals())     #打印当前层的局部变量
#
# father('xiong')

def father(name):
    # print('from father %s' %name)
    def son():
        print('我的爸爸是%s'%name)
        def grandson():
            name = "我自己"
            print('我的爷爷是%s'%name)
        grandson()
    son()

father('xiong')
嵌套练习1

六、闭包

七、无参装饰器

八、装饰器应用示例

 

九、超时装饰器

猜你喜欢

转载自www.cnblogs.com/XJT2018/p/10861241.html