python基础(@)

@说到底就是一个装饰模式,使用装饰的结果替代被装饰的对象。

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)

你可能感兴趣的:(python基础(@))