记录自己学习py基础的点点滴滴
装饰器
- 由浅入深,先定义一个函数,把这个函数赋值给一个变量,然后可以通过变量直接调用函数
def woami():
print('xiaoyang')
f = woami
f()
xiaoyang
- 函数有个name属性,可以看到赋值给变量并没有改变函数的name属性
woami.__name__
'woami'
woami.__name__
'woami'
- 现在我们要增强woami函数的功能,或者增强任意一个函数的功能,在不改变函数定义的情况下,这种在代码运行期间动态增加函数功能的方式称之为装饰器(decorator)
- 事实上装饰器在做的事,是接受当前函数作为参数,返回一个新的函数出来,本质上是一个返回函数的高阶函数
def log(func):
def new(*args, **kw):
print('call %s:' % func.__name__)
return func(*args, **kw)
return new
- 可以看出装饰器,就是上面说的一个函数而已,要让他起到上述装饰器真正的作用需要使用
@ 我们就称它为修饰符号吧
@log
def woami():
print('xiaoyang')
woami()
call woami():
xiaoyang
- @log的作用等同于下面这行
woami = log(woami)
- 请注意装饰器返回了一个新函数new,所以被装饰器修饰过的woami,已经不是原来的woami了,而是一个新的函数,我们来验证一下
woami.__name__
'new'
很神奇对吧,别慌,我们接着看,再来修饰一个函数玩玩吧
@log
def again():
print('又来~')
again()
call again:
又来
可以看到,我们之前定义好的返回函数log,在定义任何函数之前@一下,就可以起到修饰的作用了。很好,掌握了装饰器的初级用法,很开心。。。
网友评论