def log(text):
def deroctor(func):
def wrapper(*args, **kw):
print('ppp')
print(text)
return func(*args, **kw)
return wrapper()
return deroctor
@log('sssssss')
def now(a,b,c,d):
print(a+b+c+d)
now(3,4,5,6)
这种在代码运行期间动态增加函数功能的方式,称之为“装饰器”(Decorator)。
decorator,传入一个函数(这个函数就是他要装饰的函数。默认函数名是func)作为参数,并返回一个函数对象
把@log
放到now()
函数的定义处,相当于执行了语句:now = log(text) 把装饰器赋给了一个跟要装饰的函数名称同名的变量
由于log()
是一个decorator,返回一个函数对象,同名的now
变量指向了新的函数对象(deroctor),于是调用now()
将执行新函数,即在log()
函数中返回的deroctor对象。
wrapper()
函数的参数定义是(*args, **kw),是提供给func函数定义参数。
它们是可变参数
如果我们不确定要往函数func中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;
如果我们不知道要往函数func中传入多少个关键词参数,或者想传入字典作为关键词参数时,那就要使用**kwargs。