python 语法之 装饰器
eg:
装饰器 decorator
或者称为包装器,是对函数的一种包装。
它能使函数的功能得到扩充,而同时不用修改函数本身的代码。
它能够增加函数执行前、执行后的行为,而不需对调用函数的代码做任何改变。
在计算机科学中,闭包(英语:Closure),
又称词法闭包(Lexical Closure)或函数闭包(function closures),
是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,
即使已经离开了创造它的环境也不例外。
eg+++++++++++++++++++
# print_msg是外围函数
def print_msg():
msg = "I'm closure"
# printer是嵌套函数
def printer():
print(msg)
return printer
# 这里获得的就是一个闭包
closure = print_msg()
# 输出 I'm closure
closure()
msg是一个局部变量,在print_msg函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。
闭包就是引用了自有变量的函数,这个函数保存了执行的上下文,可以脱离原本的作用域独立存在。
普通的装饰器
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('call %s():' % func.__name__)
print('args = {}'.format(*args))
return func(*args, **kwargs)
return wrapper
调用:
@log
def test(p):
print(test.__name__ + " param: " + p)
test("I'm a param")
输出:
call test():
args = I'm a param
test param: I'm a param
等同于
def test(p):
print(test.__name__ + " param: " + p)
wrapper = log(test)
wrapper("I'm a param")
装饰器只是个方法;@语法只是将函数传入装饰器函数
值得注意的是@functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func 函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去除@functools.wraps(func),你会发现test.__name__的输出变成了wrapper。
装饰器允许传入参数,一个携带了参数的装饰器将有三层函数
装饰器这一语法体现了Python中函数是第一公民,函数是对象、是变量,可以作为参数、可以是返回值,非常的灵活与强大。
egg========================
def outer(func):
def inner():
print("他手机总震动!")
func()
return inner
@outer
def fun1():
print("jin yun hao")
@outer
def fun2():
print("he dian xing")
def main():
fun1()
fun2()
main()