祭奠碌碌无为的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装饰器(新年第一写)的更多相关文章

  1. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  2. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  3. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  4. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  5. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  6. Python高级特性: 12步轻松搞定Python装饰器

    12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则:  http://python.jobbole.com/84151/   基本上一开始很难搞定python的装 ...

  7. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  8. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  9. (转)python装饰器二

    Python装饰器进阶之二 保存被装饰方法的元数据 什么是方法的元数据 举个栗子 def hello(): print('Hello, World.') print(dir(hello)) 结果如下: ...

随机推荐

  1. JavaEmail-邮箱

    package service; import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.Message;import java ...

  2. centos6.6 安装adb环境

    a.安装JDK环境 centos linux JAVA(openjdk)软件包名 1.java-1.7.0-openjdk (OpenJDK Runtime Environment) 2.java-1 ...

  3. Win10上安装Keras 和 TensorFlow(GPU版本)

    一. 安装环境 Windows 10 64bit  家庭版 GPU: GeForce GTX1070 Python: 3.5 CUDA: CUDA Toolkit 8.0 GA1 (Sept 2016 ...

  4. Django -- 部署Django 静态文件不能获取

    # 在部署上下之后无法正常显示后台admin的静态文件 # 因为文件都在django内部,而在nginx中将配置都设置到一个位置: # 措施: 1.在settings.py文件中添加配置; STATI ...

  5. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库——unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  6. 关于jQuery的一些东西

    1.jQuery的选择器学习     基本选择器        id选择器            $("#id名") 返回的是存储了指定的HTML元素对象的数组        标签 ...

  7. android 中的Http请求类HttpUrlConnection和HttpClient类

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient. 如何选择这两个类的使用:android-developers.blogspot.com/2011 ...

  8. Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)

    前言 前面已经学习了Apache Commons Beanutils包里的PropertyUtils和动态bean,接下来将学习剩下的几个工具类,个人觉得还是非常实用的,特别是CollectionUt ...

  9. Centos7安装Mysql8(官方整合包)

    1. 下载整合包 [root@master ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.12-1.el7.x86_ ...

  10. k8s小工具

    1.Kubectx kubectx是一个在多集群和多命名空间的时候使用的非常好用的工具,kubectx与kubens绑定,kubectx用来在集群之间切换,kubens用来切换namespace. # ...