装饰器
主要内容:
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 { [ ( 函数 ) ] }
