装饰器

装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能。
如果我们需要打印函数调用前后日志,可以这么做
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. ssh中的 Connection closed by ***

    另一台电脑的 mac/windows10/win7 都可以连接,就这台电脑不可以,但是能 ping 通, ssh 时总是 Connection reset by xxx 或 Connection cl ...

  2. 2、zabbix工作原理及安装配置

      Zabbix架构:zabbix基本术语.zabbix安装.配置和应用 Zabbix架构中的组件: zabbix-server:C语言    zabbix-server和zabbix-agent通过 ...

  3. 2017-2018-2 20165306 实验三《敏捷开发与XP实践》实验报告

    实验三<敏捷开发与XP实践>实验报告 实验报告封面 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一) 敏捷开发与XP实践-1 实验要求: 参考 代码规范 安装alibaba 插 ...

  4. WebBrowser获取完整COOKIE

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool ...

  5. 中国地区免费注册bitcointalk论坛教程

    bitcointalk论坛是著名的老牌比特币论坛,中本聪当年也在这里和各路大神探讨.但现在国家的高墙禁止网民访问. 你可能会用一个国外的代理工具来看贴,看贴确实可以,但是如果想注册,注册完后就会发现帐 ...

  6. 《spring boot 实战》读书笔记

    前言:虽然已经用spring boot开发过一套系统,但是之前都是拿来主义,没有系统的,全面的了解过这套框架.现在通过学习<spring boot实战>这本书,希望温故知新.顺便实现自己的 ...

  7. idea使用教程(2)

    目录: 1. open和import的区别 2.修改虚拟机配置信息 3.安装目录和设置目录 1. open和import的区别 open:如果本身就是idea项目,则可以直接open打开; impor ...

  8. jGrid + echart 后台管理

    用来初始化表的大小: $(select_dom).jqGrid( 'setGridWidth', parent_column.width() ); 表的大小随着页面的宽度变化: $(window).o ...

  9. 安卓自动化测试——rf

    ${a} Get Text //android.widget.TextView[contains(@text,"历史位置")]/../../../android.widget.Li ...

  10. Axure 第一次交互 实现跳转页面