python装饰器(新年第一写)

Posted 咻_python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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面向对象学习之八,装饰器

python 装饰器的使用

python装饰器

Python 装饰器

python装饰器