叠加装饰器
叠加装饰器:在同一个被装饰对象中,添加多个装饰器,并执行(装饰器在被装饰对象被调用时,才会执行添加的功能)
叠加装饰器:
装饰顺序:由下而上,调用wrapper装饰器拿到返回值inner
执行顺序:由上而下,调用装饰过后的返回值inner
ps:无论inner中出现任何判断,最后都要返回‘调用后的被装饰对象’func(*args,**kwargs)
有参装饰器
有参也可叫做三层闭包,装饰器后面加上括号传入参数(可以用作用户权限区分)
无参装饰器
装饰在被装饰对象时,没有传入参数的装饰器
wraps
作用:修复的是被装饰对象的空间
from functools import wraps
def wrapper(func):
@wraps(func) # 修改名称空间: inner ---》 func
def inner(*args, **kwargs):
'''
此处是装饰器的注释
:param func:
:return:
'''
res = func(*args, **kwargs)
return res
return inner # ---》 func
@wrapper
def index():
'''
此处是index函数的注释
:return:
'''
pass
# print(index) # 函数对象
#
# # 函数对象.__doc__: 查看函数内部的注释
index()
print(index.__doc__) # inner.__doc__
迭代器
原理:内置--iter--都是可迭代对象,加上next取值就是迭代器,迭代器不依赖索引取值,每次只取一个值并且停顿,内存里面只存一个值,如果想要获取前面的值,只能从新执行iter;
优点:不依赖索引取值,占用内存小
缺点:一次只取一个值,要想调用前面的值,只能从新创建迭代对象或者从新调用iter,当两个循环同时使用一个迭代器时,只有一个能执行成功