闭包和装饰器
什么是闭包
闭包从字面意思上理解就是封闭包含,表现形式就是一个函数包含着另外一个函数。闭包是指:函数内部函数对外部作用域而非全局的引用
def outter(): x = 1 def inner(): print(x) return inner # 返回inner函数对象 f = outter() # 返回函数对象 f() # 调用inner, 会打印1 # 还可为外层函数传入参数 def outter(x): def inner(): print(x) return inner f = outter(1) f() # 同样打印1 ##
闭包的意义
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。
什么是装饰器
什么是装饰器
为被装饰对象增加新的功能,而不改变被装饰对象的代码和调用方式。
- 装饰器本身其实是任意可以调用的对象
- 被装饰的对象可以是任意可调用的对象
import time def test(): print("test func") time.sleep(1) def time_count(func): def wrapper(): start = time.time() func() end = time.time() print(end - start) return wrapper test = time_count(test) # 调用时会返回wrapper这个函数对象,通过赋值方式把它重新命名为test, 那么调用test就相当于调用wrappwer # 如果test需要传入参数,还可以使用为其传入参数 def test(a, b): print("test func") time.sleep(1) def time_count(func): def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数 start = time.time() func(*args, **kargs) end = time.time() print(end - start) return wrapper test = time_count(test)
语法糖
test = time_count(test) # 上面这种方式,可以使用下面的方法实现 @time_count def test(): print("test func")
带参数的装饰器
def test(a, b): print("test func") time.sleep(1) def outter("arg1"): def time_count(func): def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数 print("use arg1") start = time.time() func(*args, **kargs) end = time.time() print(end - start) return wrapper return time_count test = outter('args')(func) # 这样就可以为装饰器传入参数了