装饰器
主要内容:
1.函数名的运用,第一类对象
2.闭包
3.装饰器
4.通用装饰器的回顾
5.函数的有用信息
6.带参数的装饰器
7.多个装饰器同时装饰一个函数
一.函数名的运用
函数名是一个变量,但是一个特殊的变量,与括号配合可以执行函数的变量
1.函数的内存地址
def fun(): print('呵呵') print(fun) # 返回这个函数的内存地址
2.函数名可以赋值给其他的变量
def fun(): print('呵呵') print(fun) a = fun a()
3.函数名可以当作容器类元素
def func1(): print('呵呵') def func2(): print('哈哈') def func3(): print('拉拉') def func4(): print('可可') def func5(): print('哦哦') lst = [func1,func2,func3,func4,func5] for i in lst: i()
4.函数名可当做函数的参数
def func(): print('吃了么') def func2(fn): print('我是func2') fn() print('我是func2') func2(func)
5.函数名可以作为函数的返回值
def func_1(): print('这里是函数1') def func_2(): print('这是函数2') print('这是函数1') return func_2 fn = func_1() fn()
二.闭包
什么是闭包?闭包就好是内层函数,对外层函数(非全局)的变量的引用,叫闭包
def func1(): name = 'alex' def func2(): print(name) func2() func1()
我们可以用_closure_来检测函数是否是闭包,如果是闭包就返回:cell,不是闭包就返回None
def func1(): name = 'alex' def func2(): print(name) func2() print(func2.__closure__) func1()
如何在函数外边调用内部函数
def outer(): name= "alex" def inner(): print(name) return inner fn = outer() fn() # 访问内部函数
多层嵌套如何办
def func1(): name = 'alex' def func2(): def func3(): def func4(): print(name) return func4 return func3 return func2 func1()()()()
闭包的作用就是一个变量能够常驻内存,供后面的程序使用
三.装饰器初始
软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发
开放:对功能扩展开放
封闭:对修改代码封闭
def create_people(): print('女娲很厉害,还会捏人呢') def warter(fn): def inner(): print('先取水') fn() print('最后在上烤炉') return inner create_people= warter(create_people) create_people() # 这个create_people其实相当于inner
我们使用warter函数把create_people给包装一下,在不修改create_people的前提下,完成了对create_people的函数的功能添加
语法糖:@装饰器
1.最基本的
def wen_jin(fn): def inner(): print('执行函数之前') fn() print('执行之后') return inner @wen_jin # 这个就相当于yue = wen_jin(yue) #也就是个inner def yue(): print('大家好') yue()
2.中级
# 最基本的参数传递 def wen_jin(fn): def inner(name): print('函数执行之前') fn(name) print('函数执行之后') return inner @wen_jin def yue(name): print('呵呵了',name) yue('熬啊')
3.最终(也是最基本的装饰器格式)
# 带参数了,还需要返回值 def wrapper(func): def inner(*args,**kwargs):#聚参 print('函数之前要执行的内容') ret = func(*args,*kwargs) # 解参 print('函数之后要执行的内容') return ret #返回这个函数的返回值 return inner @wrapper def target_func(a,b,c,d): print('函数执行中%s'%a,b,c,d) return target_func(1,3,6,2)
4.函数的有用信息
1.给函数添加注释
在函数的第一行加上3个三引号
2.如何获取函数的相关信息
函数名.__name__可以查看函数的名字
函数名.__doc__可以查看函数文档的注释
5.修改函数的名称
from functools import wraps 引入模块
@wraps(函数名)
def inner()
6.装饰器传参
就是在最外层加一层,里面可以添加一个变量
7.多个装饰器装饰同一个函数
顺序是:321函数123 { [ ( 函数 ) ] }