函数的注释
装饰器的回顾:
装饰器的作用:在不改变原有代码的基础上给函数添加功能
通用装饰器的写法:
def wrapper(fn):
def inner(*args,**kwargs):
'''在目标函数之后要做的事情'''
ret = fn(*args,**kwargs)
'''在目标函数之后要做的事情'''
return ret
return inner
@wrapper
def target():
print("我是目标函数")
target()
执行过程:
1.程序向下执行,当执行到@wrapper的时候,把函数作为参数传递给wrapper.
inner函数.重新赋值给target
2.当执行到target的时候,我们实际上执行的是inner函数,inner函数会先执行函数之前的代码,然后在执行你的目标函数,执行完目标函数最后执行的是目标函数之后的代码
如何给函数添加注释:
用六个双引号,在最中间回车,如下所示:
def chi(food,drink):
"""
这里是函数的注释
:param food:
:param drink:
:return:
"""
print(food,drink)
return "very good"
def chi(food,drink):
print(food,drink)
print(chi.__doc__) #获取函数的文档注释
print(chi.__name__) #获取到函数名称
return "very good"
chi("吃嘛嘛香","我不想吃")
print(chi.__doc__)
print(chi.__name__)
__doc__和__name__: 注意,这里是两个下划线 下划线+下划线+name / doc +下划线+下划线
函数名.__name__可以查看函数的名字
函数名.__doc__可以查看函数的文档注释
引入函数模块
from functools import wraps
from functools import wraps
# 装饰器:对传递进来的函数进行包装,可以在目标函数之前和之后添加任意的功能
def wrapper(func):
@wraps(func) #使用函数原来的名字
def inner(*args,**kwargs):
'''在执行目标函数之前要执行的内容'''
ret = func(*args,**kwargs)
'''在目标函数之后要执行的内容'''
return ret
return inner
@wrapper
def target_func():
print("我是目标函数")
target_func()
print(target_func.__name__)
@wrapper
def new_target_func():
print("我是另一个目标函数")
new_target_func()
print(new_target_func.__name__)
*args和**kwargs什么时候打散,什么时候聚合
1.接收参数的时候聚合,参数声明
2.传递参数的时候打散,给函数传递实参
def wrapper(func):
@wraps(func)
def inner(*args,**kwargs): #这里是聚合
'''在目标函数之前要执行的内容'''
ret = func(*args,**kwargs) #这里是打散,这里的作用,其实就是为了保证我可以装饰所有的函数而准备的
'''在目标函数之后要执行的内容'''
return ret
return inner
装饰器传参
现在来这样一个场景,还是来约一约小妹妹
from functools import wraps
def wrapper(fn):
@wraps(fn)
def inner(*args,**kwargs):
print("问问金老板,行情怎么样")
ret = fn(*args,**kwargs)
print("艹,金老板骗我")
return ret
return inner
@wrapper
def yue():
print("约一约")
yue()
接下来是函数的传参,给函数一个开关来决定装饰器是否装饰函数
from functools import wraps
def wrapper_out(flag):
def wrapper(fn):
@wraps(fn)
def inner(*args,**kwargs):
if flag == True:
print("问问金老板,行情怎么样")
ret = fn(*args,**kwargs)
print("艹,金老板骗我")
return ret
else:
ret = fn(*args,**kwargs)
return ret
return inner
return wrapper
@wrapper_out(False)
def yue():
print("约一次又不会死")
yue()
@wrapper_out(True)
def yue():
print("xxxxx")
yue()
多个装饰器装饰同一个函数
def wrapper1(fn):
def inner(*args,**kwargs):
print("111")
ret = fn(*args,**kwargs)
print("222")
return ret
return inner
def wrapper2(fn):
def inner(*args,**kwargs):
print("333")
ret = fn(*args,**kwargs)
print("444")
return ret
return inner
@wrapper1
@wrapper2
def eat():
print("我想吃水果")
eat()
多个装饰器装饰一个函数,其实说白了就是我用几个功能去和你函数搞事情