Python装饰器(函数)学习笔记

Python装饰器(函数)学习笔记

要学习好装饰器必须掌握好三个知识点:

=========================================

1、函数作用域:L_E_G_B顺序查找变量。

x = 10

def f():

  t = 5

  def inner():

    count = 7

    return 1

2、高阶函数。

  a 函数名可以作为参数输入

  b 函数名可以作为返回值输出

3、闭包。

  def outer():

    x = 10

    def inner():#条件1:内部函数

      print(x)#条件2:外部环境的一个变量

    return inner  #结论:内部函数inner就是一个闭包。

  f = outer()

  f()

闭包:如果在一个内部函数里,在对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

 

如上例,inner就是内部函数,inner引用了外部作用域的变量x(x在外部作用域outer里,但不是全局作用域),则这个内部函数inner就是一个闭包。

关于闭包:闭包=内部函数快+定义函数时的环境

==============================

 装饰器
import time
def foo():
  print("foo......")
  time.sleep(2)
def bar():
  print("bar......")
  time.sleep(3)
def show_time(f):
  start = time.time()
  f()
  end = time.time()
  print('spend %s' % (end - start))
show_time(foo)
show_time(bar)
#这种方式修改了foo()函数的调用方式,no!no!
#再来修改吧!
import time
def show_time(f):#装饰器函数,主要目的是为函数添加新功能。
  def inner():#闭包函数
    start = time.time()
    f()
    end = time.time()
    print('spend %s' % (end - start))
  return inner
foo = show_time(foo)
bar = show_time(bar)
foo() #没有改变原来的调用方式
bar() #没有改变原来的调用方式
#===========================================================
# 现在看看python对装饰器的高大上包装
import time
def show_time(f):#装饰器函数,主要目的是为函数添加新功能。
  def inner():#闭包函数
    start = time.time()
    f()
    end = time.time()
    print('spend %s' % (end - start))
  return inner
@show_time # foo = show_time(foo)
def foo():
  print("foo......")
  time.sleep(2)
@show_time # bar = show_time(bar)
def bar():
  print("bar......")
  time.sleep(3)
foo()
bar()
# =============================================================

posted @ 2018-03-06 10:00  紫柏之梦  阅读(112)  评论(0)    收藏  举报