python学习笔记之装饰器
python学习笔记之装饰器
昨日内容回顾
名称空间
名称空间就是存放变量名和变量值关系的地方
内置名称空间:python解释器自带函数的空间
全局名称空间:定义的变量名和函数名的空间
局部名称空间:函数体定义的变量名名的空间
存活时间
内置名称空间存活于python解释器使用时
全局名称空间存活于当前py文件中
局部名称空间存活于函数体代码运行时
名称空间中的查找顺序
局部空间——>全局空间——>内置空间
哪怕三个名称空间中都有相同的名字,依旧是按照这个顺序来查找的。
作用域
全局有效:内置名称空间、全局名称空间
局部有效:局部名称空间
名称空间相关关键字
global
局部名称修改全局空间中的不可变类型声明
nonlocal
局部名称修改局部名称声明
函数名的多种用法
- 函数名可以当做变量名赋值
- 函数名可以当做函数的实参
- 函数名可以当做函数的返回值
- 函数名可以当做容器类型的元素
函数的嵌套
函数内部定义单个或者多个函数的
今日学习内容
闭包函数
闭包函数的两大特征
-
闭:定义在函数内部的函数(嵌套)
-
包:内部函数使用了外层函数名称空间中的名字
外部函数返回值为内部函数的函数名
闭包函数的实际应用
闭包函数也可以给函数体传参
内部函数空间中找不到变量名绑定关系时,会在外部函数空间中找
def a():
munber = 1
def b():
print(munber)
b函数在当前空间中找不到munber的值,便会向外部空间中找。
装饰器简介
装饰器需要运用到这几天所学的所有函数知识点
装饰器的本质:
在不改变被装饰对象原有的调用方式和内部代码的情况下,给被装饰的对象加上新的单个或多个功能。
装饰器原则:
对扩展开放:开放并可增加扩展功能
对修改封闭:封闭主体代码并修改额外功能
时间模块
import time # 调用时间模块
time.time # 获取当前时间戳
time.sleep # 睡眠设定时间后才继续运行
装饰器原理解析
装饰器模板
编写装饰器有一套固定的模板格式
def 装饰器函数名(实际功能函数名)
def 封包函数名(*arg,**kwargs)
执行实际功能函数前,需要的额外的功能
变量名 = 实际函数功能名(*arg,**kwargs)
执行完实际功能函数后,需要的额外功能
return 变量名
return 封包函数名
装饰器语法糖
作用:让代码写的更简洁
如:
先创建一个装饰器
def 装饰器函数名(实际功能函数名)
def 封包函数名(*arg,**kwargs)
执行实际功能函数前,需要的额外的功能
变量名 = 实际函数功能名(*arg,**kwargs)
执行完实际功能函数后,需要的额外功能
return 变量名
return 封包函数名
实际使用装饰器
实际功能函数名 = 装饰器函数名(实际函数功能名)
等价于
@装饰器函数名
实际功能函数名()
使用语法糖 同样也要知道语法糖的实际意义是什么。
装饰器修复技术
from functools import wraps
def f1(func):
@wraps(func)
def f2():
func()
return f2
@f1
def f3():
pass
print(f3.__name__)
就是使 实际功能函数的参数指向,保持原本的函数名
不影响代码使用,暂时这个阶段感觉不到有啥用。。。
本周小结
这个星期学习的知识点很多,把装饰器弄明白还是很有成就感的。

浙公网安备 33010602011771号