1、什么样的函数称为闭包函数?
主要满足两点:函数内部定义了函数,引用了外部变量但非全局变量
2、python装饰器用于扩展原来函数功能的一种函数
3、装饰器的作用:它可以让被装饰的函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象
(函数的指针)
装饰器的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被装饰的函数。从上面记住几点属性,以后便于后面更好的理解:
实质:是一个函数
参数:是你要被装饰的函数名(并非调用函数)
返回:是装饰完的函数名(也非调用函数)
作用:为已经存在的对象添加额外的功能
特点:不需要对对象代码做任何代码上的变动
import time
def func():
time.sleep(0.01)
print('代码运行时长:装饰器')
def timmer(f): # 装饰器函数
def inner():
start = time.time()
f() # 被装饰器的函数
end = time.time()
print(end-start)
return inner
func = timmer(func)
func()
# 代码运行时长:装饰器
# 0.01500082015991211
4、python装饰器有很多经典的应用场景,比如:插入日志的性能测试、事务处理、权限校验等。
装饰器是解决这类问题的绝佳设计。
5、函数原则:开放封闭原则
(1)开放:对扩展是开放的
(2)封闭:对修改是封闭的
6、语法糖
import time
def timmer(f): # 装饰器函数
def inner():
start = time.time()
ret = f() # 被装饰的函数
end = time.time()
print(end - start)
return ret
return inner
@timmer # @装饰器的函数名
def func():
time.sleep(0.01)
print('被装饰的函数')
return '装饰器'
print(func())
8、装饰器的固定模式
# 例子
import time
def timmer(f): # 装饰器函数
def inner(*args,**kwargs):
"""被装饰的函数执行前增加的功能"""
ret = f(*args,**kwargs) # 被装饰的函数
"""被装饰的函数执行后增加的功能"""
return ret
return inner
@timmer # @装饰器名
def func(a,b): # 被装饰的函数
time.sleep(0.01)
print('被装饰器函数 ')
return '装饰器'
func = timmer(func) # 演变原理
print(func(1,2))
9、复习装饰器:
(1)开发原则:开放封闭原则(即只可扩展功能,不可修改函数)
(2)装饰器的作用:在不改变原函数调用方式的情况下,在函数的前后添加功能
(3)装饰器的本质:闭包函数
import time
def wapper(f):
def inner(*args,**kwargs):
"""调用被装饰的函数执行前添加的功能"""
ret = f(*args,**kwargs)
"""调用被装饰的函数执行后添加的功能"""
return ret
return inner
@wapper # @wapper就是holiday = wapper(holiday)
def holiday(day):
print('全天放假%s天'%day)
return '好开心!'
ret = holiday(3)
print(ret)
如果想要在函数内定义全局作用域,需要加上global修饰符