@说到底就是一个装饰模式,使用装饰的结果替代被装饰的对象。
def a(fn):
print('a')
def d(st):
print(st+ 'd')
return fn(st)
return d
def b(fn):
print('b')
return fn
@a
@b
def c(st):
print(st)
print("**********")
c('f')
c('c')
print("**********")
首先需要弄明白的是函数的传递关系,装饰器是对函数进行装饰,传递的参数就是函数。所有
@a
@b
def c(st):
print(st)
等价于
c= a(b(c))
而且是立即执行的那种。后面调用c("f“),实际就是调用d这个函数,st为传入的参数。
对于不定长的参数而言。
* args和**kwargs
当函数的参数不确定时,可以使用* args 和** kwargs,* args 没有key值,** kwargs有key值。这两个是python中的可变参数。* args表示任何多个无名参数,它是一个tuple;** kwargs表示关键字参数,它是一个dict。并且同时使用* args和** kwargs时,必须* args参数列要在** kwargs前。例如:foo(name,age,date=newdate,birthday=date)