这篇文章给大家分享的是有关python装饰器是怎样的的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
装饰器
一个普通的装饰器一般是这样:
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
这样就定义了一个打印出方法名及其参数的装饰器。
调用之,要使用@开头:
@logdef 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装饰器是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。