网站没收录的几大原因手机百度网页版
-
装饰器
- 写好的函数,不做任何修改,就可以改变执行内容,在其头或尾部加入新的流程代码
- 本质上就是使用函数嵌套,在内部嵌套定义的函数中调用原函数,从而可读在前或后加入新的代码
- 使用的关键:
- 将原函数作为参数传递一个新函数
- 在这个新函数内部定义一个嵌套函数,这个嵌套函数内容把外部函数的参数,也就是原函数执行一遍
- 将这个嵌套函数在新函数中返回
- 也就是让原函数指向一个新的函数
- 看起来好像还是在调用原函数,实际上原函数的名字(也就是指向)已经指代了一个新函数
- 疑问:装饰器似乎不可避免地引起参数多次复制式传递
def outer(origin):""" comment """def inner(*args, **kwargs):# 添加新的流程代码ret = origin(*args, **kwargs);# 添加新的流程代码return retreturn inner@outer 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])# 判断文件夹是否存在