32、python基础学习-装饰器

#!/usr/bin/env python
#__author: hlc
#date: 2019/6/2

def outer() :
    x = 3  # 定义函数时的环境,和写在outer(x),后面传入是一样的
    def inner() : # 条件一 :inner就是内部函数
        print(x) # 条件二:引用外部函数的一个变量
    return inner # 结论:内部函数inner就是一个闭包
f = outer()
f()
"""
闭包定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
闭包(closure)是函数式编程的重要的语法结构
闭包 = 内部函数 + 定义函数时的环境
"""

 

# import time
# def show_time(func) :
#     def wrapper() :
#         start_time = time.time()
#         func()
#         end_time = time.time()
#         print("spend %s"%(end_time-start_time))
#     return wrapper
# def foo() :
#     print("hello foo")
#     time.sleep(3)
# foo = show_time(foo)
# foo()
# 函数show_time就是装饰器,他把真正的业务foo包裹在函数里面
# @符号是装饰器的语法糖,在定义函数时候使用,避免再一次赋值操作

# import time
# def show_time(func) :
#     def wrapper() :
#         start_time = time.time()
#         func()
#         end_time = time.time()
#         print("spend %s"%(end_time-start_time))
#     return wrapper
# @show_time  # 等于foo = show_time(foo)
# def foo() :
#     print("hello foo")
#     time.sleep(3)
# @show_time
# def bar() :
#     print("bar...")
#     time.sleep(6)
# foo()
# bar()
"""
如上所示,这样我们就可以省去bar = show_time(bar)这一句了,直接调用bar()即可得到我们想要的效果;
如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不是重复修改函数或者增加新的封装;
这样我们就提高了程序的可重复利用性,并增加了程序的可读性;
这里需要注意的问题,foo = show_time(foo)其实是把wrapper引用的对象引用给了foo,而wrapper里的变量func之所以可以用,就是因为wrapper是一个闭包函数。
"""

 

# 给装饰器加参数
# import time
# def logger(flag="") :
#     def show_time(func) :
#         def wrapper() :
#             start_time = time.time()
#             func()
#             end_time = time.time()
#             print("spend %s"%(end_time-start_time))
#             if flag == "true" :
#                 print("打印日志。。。")
#         return wrapper
#     return show_time
# @logger("true") # 添加参数可以打印日志
# def foo() :
#     print("hello foo")
#     time.sleep(3)
# @logger() # 为空时,什么都不打印
# def bar() :
#     print("bar...")
#     time.sleep(6)
# foo()
# bar()

  

  

  

posted @ 2019-06-03 08:20  hlc-123  阅读(106)  评论(0编辑  收藏  举报