装饰器

装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能。
如果我们需要打印函数调用前后日志,可以这么做
def log(func):
print('%s is running' % func.__name__)
func() def bar():
print('bar')
#将bar作为函数log参数传入
>>>log(bar)
bar is running
bar

这样写下来一个函数打印一个函数的日志是没有问题的,但是很多呢?

def log(func)
def wrapper(*args,**kw):
print('%s',%func.__name__)
return func(*args,**kw)
return wrapper def bar():
print('bar')

bar = log(bar) bar()

借助decorator的语法糖,一个@就可以解决

def log(func):
def wrapper(*args,**kw):
print('call %s()' %func.__name__)
return func(*args,**kw)
return wrapper @log #相当于bar = log(bar)
def bar():
print('this is bar') @log
def bar2():
print('this is bar2')
装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。

装饰器是允许带参数的,装饰器的语法可以使我们在调用时,提供其他参数。
import functools
def log(level):
def decorator(func):
#@functools.wraps(func) #这里先注释一下
def wrapper(*args,**kw):
print('%s %s()'% (level,func.__name__))
return func(*args,**kw)
return wrapper
return decorator
@log('execute')
def bar():
print('bar')

>>>bar()
execute bar()
bar >>>print(bar.__name__)
wrapper

这里的@log('execute')相当于    bar = log('execute')(bar)

函数对象可以通过__name__属性拿到名称

bar.__name__  拿到的是wrapper,这是因为bar函数经过装饰器装饰之后,最终返回了wrapper函数

如果不更改bar.__name__的属性,在一些依赖函数签名的代码中就会出错

Python自带的functools.wraps就是将原始函数__name__赋值给wrapper

import functools
def log(level):
def decorator(func):
@functools.wraps(func) #这里删除注释
def wrapper(*args,**kw):
print('%s %s()'% (level,func.__name__))
return func(*args,**kw)
return wrapper
return decorator
@log('execute')
def bar():
print('bar') >>>bar()
execute bar()
bar >>>print(bar.__name__)
bar #__name__还原成了bar

类的装饰器

参考链接知乎--Python装饰器

Python装饰器--decorator的更多相关文章

  1. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  2. Python 装饰器Decorator(一)

    (一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...

  3. Python装饰器(Decorator)简介

    Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...

  4. Python 装饰器Decorator(二)

    对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. python语法32[装饰器decorator](转)

    一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...

  7. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

  8. python函数编程-装饰器decorator

    函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...

  9. Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

随机推荐

  1. 不消失的 taskeng 黑窗口?

    2017-01-06出来不消失的 taskeng 黑窗口? 计划运行某些程序时会出现这种现象.例如: 在计划中运行 a.bat : a.bat 里面的内容:start notepad.exestart ...

  2. sed命令使用详解

        内容来自马哥视频,感谢马哥精彩讲解 sed:编辑器 sed: Stream EDitor, 行编辑器,逐行进行处理 grep:实现文本过滤 awk:文本报告生成器 sed默认不编辑源文件,而是 ...

  3. 因样式冲突引起的div消失问题

    工作需要,搭建一个网站的模型,简单分成三个部分,标题栏,导航栏,主界面,效果如图: 但是点击界面的任意地方,中间的div块消失了,如图所示: 调试,发现在点击界面其他地方的时候display属性有变化 ...

  4. FreeCodeCamp----Intermediate Algorithm Scripting解法

    Finders Keepers 写一个 function,它浏览数组(第一个参数)并返回数组中第一个通过某种方法(第二个参数)验证的元素. 如果你被卡住了,记得开大招 Read-Search-Ask. ...

  5. Spring中JdbcTemplate使用RowMapper

    package com.cxl.demo.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util. ...

  6. 1. eclipse异常问题解决办法

    1. 内存溢出问题 问题描述:报错信息 java.lang.OutOfMemoryError: PermGen space 解决办法: 在Tomcat/bin/catalina.bat 文件下加入: ...

  7. Qt532.数值转为16进制(并填充)

    ZC:QString::number(要转换的数值, 需要转换的目标进制); ZC:QString("%1").arg(要转换的数值, 需要填充到?位, 需要转换的目标进制, 用于 ...

  8. libxml2的xpath检索中文

    ZC: xmlXPathEvalExpression(...) 当 xpath的字符串中 包含中文的时候,返回NULL,暂时不知道该怎么处理了... ZC: 下面是测试的一些代码/文件,留着以后再研究 ...

  9. vue模拟后端获取数据——json-server与express

    转载自: https://blog.csdn.net/weixin_39728230/article/details/80293892 https://blog.csdn.net/lxkll/arti ...

  10. 学习笔记32—python常见问题及解决办法

    1.Anaconda3 中 Spyder 无法打开/点击没有反应 应对方法 1).通过pip安装pyqt5:pip install pyqt5 2).输入以下命令:spyder --new-insta ...