python中的装饰器可以理解为把这个函数看作是另外一个函数的一个特殊参数,通常我们参数都是一些常见数据类型(数字、字符窜、布尔、元组、列表、集合、字典等等),这个我们把它作为 object,而且这个object是一个function。
当我们调用某个函数时,如果该函数被声明为装饰器,则应该先把该函数作为特殊参数去执行这个装饰器(装饰器的名称就是另外一个函数名)
如下代码:
def login(aa):
def decorator(func):
def wrapper(*args, **kw):
print(aa)
print('call function name is: %s' % func.__name__)
return func(*args, **kw)
return wrapper
return decorator
@login('装饰器可带任意参数')
def testd(loginid,loginpwd):
print(loginid,loginpwd)
testd('tom','123456')
(1) 装饰器可带任意参数,如果带了参数,则装饰器第一层应该接收这些参数;
(2) 如果装饰器没有带参数,则第一层直接接收func,如果带了则第二层再来接收func;
(3) 第二层或第三层接收可变参数;
(4)最后在第二层或第三层返回这个函数,其实相当于调用这个函数,因为我们目的就是调用它;