函数的注释

装饰器的回顾:

装饰器的作用:在不改变原有代码的基础上给函数添加功能

通用装饰器的写法:
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()

多个装饰器装饰一个函数,其实说白了就是我用几个功能去和你函数搞事情
 
 
 
 
posted @ 2018-06-15 17:09  ALADL  阅读(669)  评论(0编辑  收藏  举报