博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器
阅读量:6920 次
发布时间:2019-06-27

本文共 871 字,大约阅读时间需要 2 分钟。

因为函数是一个对象,而且函数对象可以被复制给变量,所以通过变量也可以调用函数

我们要在原代码上动态添加功能的方式就叫装饰器

本质上,装饰器就是一个返回函数的告诫函数。我们现在定义一个打印体制的

 

比如说我现在定义一个函数,实现以下的功能

>>> def now(): ...     print "12-23-11" ...

上面的代码实现了打印日期的功能的功能

我现在想给他添加新功能。但是不能改变函数now()函数的定义。

我现在要给他添加一个打印日志的功能

例子如下

def log(func): def wrapper(*args,**kw):         func() print 'call %s'%func.__name__ return func(*args,**kw) return wrapper @log def now(): print '2016-08-10' now()

这里的@log放在最开始定义的函数now()处。相当于执行了now=log(now)。因为log()是一个装饰器,返回一个函数(对象),所以原来的now()函数仍然存在,只是在同名的now变量指向了新的函数,于是调用now()将执行新函数。即在log()函数中返回的wrapper()函数,也就是说调用now()函数执行wrapper()函数

上面我们在装饰器中定义了参数,但是我们没有传入参数。如果装饰器内需要传入参数的话。则这么写:

def log(text): def decorator(func): def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('hello') def now(): print '2016-08-10' now() 输出内容为 hello now(): 2016-08-10

这里自定义log的文本

转载地址:http://sghcl.baihongyu.com/

你可能感兴趣的文章
报错nginx failed error: during websocket handshake
查看>>
爬姓名大全网站的姓名
查看>>
ORA-01102: cannot mount database in EXCLUSIVE 处理方法
查看>>
linux下sshd_config的StrictModes参数
查看>>
华为底部虚拟导航栏挡住布局
查看>>
项目管理的几个概念(WBS、OBS、RBS、BOM、CWS、CA)总结与区分
查看>>
菜鸟眼中的vim 编译器
查看>>
数据库密码设置
查看>>
java:抽象类与接口的姻缘
查看>>
关于linux下部署项目时遇到MYSQL_ATTR_INIT_COMMAND未定义时解决办法
查看>>
Account
查看>>
PHP集成开发环境里面的www问题
查看>>
探秘Java9之类加载
查看>>
记一次 OpenIPMI core的分析
查看>>
MySQL误操作后如何快速恢复数据?
查看>>
Bash中which的用法
查看>>
exec format error in docker
查看>>
VSCode安装使用(Python)
查看>>
解决wubi安装ubuntu时要下载系统映像文件问题
查看>>
碟中谍小组不要太夸张 Avaya要说:哈利法塔的网络很可靠
查看>>