- 闭包函数 在看装饰器之前,我们先来搞清楚什么是闭包函数。python是一种面向对象的编程语言,在python中一切皆对象,这样就使得变量所拥有的属性,函数也同样拥有。这样我们就可以理解在函数内创建一个函数的行为是完全合法的。这种函数被叫做内嵌函数,这种函数只可以在外部函数的作用域内被正常调用,在外部函数的作用域之外调用会报错,例如: 而如果内部函数里引用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此时内部函数就被称为闭包函数。闭包函数所引用的外部定义的变量被叫做自由变量。闭包从语法上看非常简单,但是却有强大的作用。闭包可以将其自己的代码和作用域以及外部函数的作用结合在一起。下面给出一个简单的闭包的例子: 而如果内部函数里引用了外部函数里定义的对象(甚至是外层之外,但不是全局变量),那么此时内部函数就被称为闭包函数。闭包函数所引用的外部定义的变量被叫做自由变量。闭包从语法上看非常简单,但是却有强大的作用。闭包可以将其自己的代码和作用域以及外部函数的作用结合在一起。下面给出一个简单的闭包的例子: def count(): a = 1 b = 1 def sum(): c = 1 return a + c # a - 自由变量 return sum
- python装饰器
def welcome(func): # 参数是一个函数 def inner_f(): """这是装饰器中的welcome函数""" print('welcome'.center(40,'~')) func() return inner_f # 返回值是另一个函数,使用该返回的函数替代作为参数的函数
@welcome # 说明底下定义的函数被welcome所装饰,使用该返回的函数替代作为参数的函数 def name(): """这个是name函数""" print('name is toto')
name() # 调用welcome 函数
1、 被装饰的函数存在参数的时候
在构建装饰器的时候,作为返回值的函数是用来替代作为参数的函数的,所以这两个函数所需要的参数必须一致。就时说再定义函数装饰器的时候,指定作为参数的函数可以由于任意个参数以及作为返回值的函数可以右任意个参数,这样就能保证再实际使用的时候不论被装饰的函数需要几个参数,都能使用该装饰器。 def welcome(func): # 参数是一个函数 def inner_f(*args,**kwargs): # 指定返回的函数可以有任意个参数 """这是装饰器中的welcome函数""" print('welcome'.center(40,'~')) func(*args,**kwargs) # 作为参数的函数也有任意个参数 return inner_f # 返回值是另一个函数
@welcome # 可以装饰一个参数的函数 def name(name): """这个是name函数""" print('name is %s' %name)
@welcome # 也可以装饰两个参数的函数 def stuinfo(name,age): print('name is %s ,age is %d' %(name,age))
name('toto') stuinfo('lala',16)