美术培训学校网站模板,企业网站建设中企动力,专业做网站企业,网络推广网站的方法装饰器 写好的函数#xff0c;不做任何修改#xff0c;就可以改变执行内容#xff0c;在其头或尾部加入新的流程代码本质上就是使用函数嵌套#xff0c;在内部嵌套定义的函数中调用原函数#xff0c;从而可读在前或后加入新的代码使用的关键#xff1a; 将原函数作为参数… 装饰器 写好的函数不做任何修改就可以改变执行内容在其头或尾部加入新的流程代码本质上就是使用函数嵌套在内部嵌套定义的函数中调用原函数从而可读在前或后加入新的代码使用的关键 将原函数作为参数传递一个新函数在这个新函数内部定义一个嵌套函数这个嵌套函数内容把外部函数的参数也就是原函数执行一遍将这个嵌套函数在新函数中返回也就是让原函数指向一个新的函数看起来好像还是在调用原函数实际上原函数的名字也就是指向已经指代了一个新函数疑问装饰器似乎不可避免地引起参数多次复制式传递 def outer(origin): comment def inner(*args, **kwargs):# 添加新的流程代码ret origin(*args, **kwargs);# 添加新的流程代码return retreturn innerouter
def fun01(*args, **kwargs):#流程代码pass
# 相当于fun01 outer(fun01)
print(outer.__name__)# 正常打印outer这个函数名字是字符串
print(outer.__doc__)# 正常打印outer这个函数注释如commentprint(fun01.__name__)# 由于装饰器的存在会输出装饰器名字本例中为inner
print(fun01.__doc__)# 由于装饰器的存在会输出装饰器inner中的注释
# 出现这样的现象是很正常的但如果想要获取原始fun01的名字与注释的话要添加新注释器在inner前面import functools
def outer(origin):functools.wraps(origin)# 新增此行作用是重指inner.__name__ origin.__name__; inner.__doc__ origin.__doc__def inner(*args, **kwargs): comment # 添加新的流程代码ret origin(*args, **kwargs);# 添加新的流程代码return retreturn innerimport os
os.path.dirname(path)# 提取path中的文件夹名称
path.rsplit(/, 1)[0]# 将path中文件名去除只保留文件夹名称
os.path.exists(path.rsplit(/, 1)[0])# 判断文件夹是否存在