装饰器
昨日回顾
函数嵌套
在一个函数中定义另一个函数,嵌套定义
默认情况下 只能在内部使用,内部函数可以访问外层函数中的内容
在一个函数的函数体中调用了另一个函数,嵌套调用
名称空间
存放名字与值的内存地址的绑定关系的内存区域
三个名称空间
内置的
存的是内置的名称,随着解释器的运行而生效,随着解释器的关闭而失效
内置的名字在任何位置都能访问到
全局的
存的是文件级别的,也就是顶着最左边,没有任何缩进的名称
局部的
存的是函数内部定义的名称,随着函数的运行而生效,随着函数的运行结束而失效
特点:只能在当前函数内访问
名称空间的查找顺序
局部 -> 全局 ->内置
作用域
分为全局和局部
内置的和全局的名称空间被划分为全局作用域
局部空间的名称处于局部作用域
强调:名称空间与作用域的访问顺序在定义时就已经确认了,与调用位置无关
函数对象
一切皆对象
函数可以当做变量来使用,除了变量不能调用外,其他用法都相同
1.函数可以调用
2.函数可以当做容器类型的元素
3.函数可以作为函数的参数
4.函数可以作为函数的返回值
闭包函数
什么是闭包函数
它本质也是一个函数,与普通函数的不同之处在于
闭包函数是一个被定义在另一个函数的内部的函数,可以直接访问到外层函数中的内容
当我们将这个内部函数用return金星返回时,外界就可以拿到这个函数的地址
同时,由于名称空间与作用域是定义时就固定了,无论你在什么位置调用这个内部函数
它都能狗访问到外层的名称,这就体现了包的概念
特点
拿到这个函数时,不仅仅只有函数地址,还包裹着外层的名称空间的内容
------------------------------------------------------------------------------------------------------------------
装饰器
什么是装饰器
器,指的就是一种工具,例如生活中的打孔器
装饰,指的是给某个已存在的对象添加装饰品
装饰的目的:
为了给被装饰的对象添加新功能或者说是增强某种能力
在程序中工具就是函数
如此一来,装饰器也就是一个函数,被装饰者也是一个函数
总结:装饰器就是用一个函数去扩展另一个已存在的函数的功能
扩展性是对于一个应用程序来说非诚重要的能力,任何应用程序都需要扩展,于是出现了开闭原则
开闭原则
对修改关闭,对扩展开放
不允许修改源代码以及调用方式
装饰器就是一种可以保证不修改源代码,也不修改调用方式,还能给函数添加新功能的方式
例如:
import time
def outer(func): def run_time(*args,**kwargs): #是为了让装饰函数能接受任何形式任何长度的参数
boot_time = time.time()
res = func(*args,**kwargs) #将参数再原模原样交给被装饰着
print("耗时:",time.time() - boot_time)
return res #把原始函数的执行结果 再交给调用者
return run_time()
装饰器的语法糖
语法糖
就是一种简便写法,使语法更简洁
该语法就可以帮我完成对原始函数的伪装
注意
1.必须卸载被装饰函数的正上方
2.在开发时装饰器必须写在被装饰函数之上
在嵌套多个装饰器时,执行的顺序是从上到下依次调用,结束的顺序反过来,是从下往上
实际开发中 没什么用
无参
def outer(func):
def wrapper(*args,**kwargs):
#新功能
res = func(*args,**kwargs)
return res
return wrapper
有参
def Outer(arg):
def outer(func):
def wrapper(*args,**kwargs)
#新功能
res = func(*args,**kwargs)
return res
return wrapper
return outer


浙公网安备 33010602011771号