装饰器是函数就会有参数?NO,参数给的是产生装饰器的函数。
def log(logfile='out.log'): def log_decorateor(function): def wrapper_wrap_the_target_function(*args,**kwargs): log_str="LOG:#THE FUCTION '"+function.__name__+"()' WAS CALLED." print(log_str) with open(logfile,'a') as opened_file: opened_file.write(log_str+'\n') return function(*args,**kwargs) return wrapper_wrap_the_target_function return log_decorateor #此处不是@log,而是@log() @log() def doSomething(): print("噼里啪啦一顿操作") @log(logfile='add.log') def add(a,b): result=a+b print("{0}+{1}={2}".format(a,b,a+b)) if __name__ == '__main__': doSomething() add(10,20)
上面的@后面跟的就不是装饰器的名称了,而是产生装饰器的函数,通过执行这个函数,给下面需要被装饰的函数生成一个装饰器。