python装饰器(新年第一写)
祭奠碌碌无为的2018,想想其实也不算碌碌无为,至少我还搞懂了装饰器,写了一堆有用没用的玩意
原来觉得装饰器挺难的,直到2018年的最后几天,突然就明白了,难道这就是传说中的开天聪么
言归正传,之所以觉得装饰器难,是因为这东西不按套路出牌,希望大家看完我写的也能在新的一年里有所收货吧
先说下要实现的功能,写一个装饰器,让装饰器可以把时间加到日志的行首,例如
20190101 000001 write log first values
20190101 000001使用装饰器写入,而write log first values使用函数写入
首先写一个正常的写入日志的函数
def write_log(values):
return values
函数介绍:一段简单的函数,只是将values写入并返回,看起来像脱了裤子放屁,先这样,后面调用装饰器的时候是需要用这个函数的
测试下函数
write_values = 'write log first values'
result = write_log(write_values)
print result
正常写入,查看文件内容
write log first values
因为需要写入时间,所以还需要一个写入处理时间的函数
import time
def now_time():
local_time = time.localtime(time.time())
time_format = '%Y%m%d %H%M%S'
time_result = time.strftime(time_format,local_time)
return time_result
函数介绍:将当前日期转换成需要的日期格式
测试下函数
now = now_time()
print now
结果是
20190101 013041
日期正常,再来写个装饰器函数
敲小黑板,这里是重点,重点,重点,重要的事情说三遍---------------------------------------------------------
def add_time_line_start(func1):
def insert_time():
now = now_time()
return now +' ' + func1()
return insert_time
函数介绍:首先定义了一个装饰器函数add_time_line_start,传入了一个参数是func1,之所以说装饰器不按套路出牌这里是诡异地方1,这里传入的func1参数其实是个函数,并不是我们平常认为的一个字符串或者list什么的,接下来是装饰器里面的insert_time函数,这个函数是装饰器的功能函数,也就是装饰器需要实现的功能在这里实现。说一下insert_time的功能,获取到当前时间,并且把当前时间拼到传入的函数前面返回。最后最外层是返回inser_time函数,即将拼接好的结果返回
测试下函数,这里需要全部的函数了,现在把全部函数都放进来,存成一个文件叫zsq.py
#!/usr/bin/python
# coding: UTF-8 import time # 日期时间函数
def now_time():
local_time = time.localtime(time.time())
time_format = '%Y%m%d %H%M%S'
time_result = time.strftime(time_format,local_time)
return time_result # 装饰器函数
def add_time_line_start():
def insert_time():
now = now_time()
return now + ' ' + func1()
return insert_time #调用装饰器
@add_time_line_start #看起来没什么用的函数
def write_log(values):
return values write_values = 'write log first values'
result = write_log(write_values)
print result
这里看到了调用装饰器是使用的@方法,@add_time_line_start,说下我的理解,这个其实就是等于平常函数的add_time_line_start(write_log())这种方法,这也就是装饰器不按套路出牌这里是诡异地方2
测试下
python zsq.py
结果是
Traceback (most recent call last):
File "zshq1.py", line 28, in <module>
print write_log(write_values)
TypeError: insert_time() takes no arguments (1 given)
卧槽,报错了,为什么,这也是个坑,为这个真是研究了半天,因为传入装饰器的函数有传参,所以insert_time()需要同步传参,但是传什么呢,这里有个特殊用法,在函数传参的地方写上self就好了,下面是改正后的结果def insert_time(): return now + ' ' + func1()注意这两个地方
#!/usr/bin/python
# coding: UTF-8 import time # 日期时间函数
def now_time():
local_time = time.localtime(time.time())
time_format = '%Y%m%d %H%M%S'
time_result = time.strftime(time_format,local_time)
return time_result # 装饰器函数
def add_time_line_start(func1):
def insert_time(self):
now = now_time()
return now + ' ' + func1(self)
return insert_time #调用装饰器
@add_time_line_start #看起来没什么用的函数
def write_log(values):
return values def write_log1(values):
return values write_values = 'write log first values'
result = write_log1(write_values)
print result
再测试下
python zsq.py
结果是
20190101 022028 write log first values
这次OK了,安心睡觉咯,留个疑问吧,就是这个装饰器是不是对下面所有的函数都会复用呢,答案当然是自己动手试试咯
python装饰器(新年第一写)的更多相关文章
- 你必须学写 Python 装饰器的五个理由
你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- Python高级特性: 12步轻松搞定Python装饰器
12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则: http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装 ...
- Python 装饰器入门(下)
继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...
- Python 装饰器入门(上)
翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...
- (转)python装饰器二
Python装饰器进阶之二 保存被装饰方法的元数据 什么是方法的元数据 举个栗子 def hello(): print('Hello, World.') print(dir(hello)) 结果如下: ...
随机推荐
- 各种height 以及判断滚动条是否已拉到页面最底部
DTD已声明 IEdocument.documentElement.scrollHeight 浏览器所有内容高度 ,document.body.scrollHeight 浏览器所有内容高度docu ...
- 【WebAPI No.2】如何WebAPI发布
介绍: Asp.Net Core在Windows上可以采用两种运行方式.一种是自托管运行,另一种是发布到IIS托管运行. 自托管 首先有一个完好的.Net Core WebAPI测试项目,然后进入根目 ...
- Java工程师学习指南 中级篇
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- Node.js开发框架Express4.x
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...
- MJPEG 格式分析
MJPEG简介 MJPEG(技术即运动静止图像(或逐帧)压缩技术)是24-bit的"true-color"影像标准.MJPEG的工作是将RGB格式的影像转换成YCrCB格式,目的是 ...
- VB.NET 窗體操作
Private Sub A1() '加载窗体 frm1.Show() End Sub Private Sub A2() '離開 Process.GetCurrentProcess().Kill() E ...
- elasticsearch6.7 05. Document APIs(4)Delete API
3.Delete API delete API 可以让你删除一个特定id的文档,下面例子删除twitter索引中_doc类型.id为1的文档: DELETE /twitter/_doc/1 返回结果: ...
- Mybatis generator代码生成
背景 项目中使用Mybatis做持久层框架,但由于开发成员水平不一,写dao的时候,各有各的偏好,有时候还会写出带sql注入漏洞的代码. 出现sql注入漏洞,一般是#和$的区别没弄明白: $ 直接把字 ...
- eclipse使用struts2找不到action方法或找不到action的错误记录
在确认web.xml已经配置, 配置好struts.xml , 代码没有报错, jar包没有问题, 服务器也没有问题, 代码逻辑没有问题, 关键字方法名action都没有写错, 可以运行旧的相同的代码 ...
- docker swarm 搭建及跨主机网络互连案例分析
准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...