zoukankan      html  css  js  c++  java
  • 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了,安心睡觉咯,留个疑问吧,就是这个装饰器是不是对下面所有的函数都会复用呢,答案当然是自己动手试试咯

  • 相关阅读:
    docker常用操作
    docker-vlanhost
    打补丁说明
    mycat RULEs
    头晕的android SDK Manager and 找不到真机
    高格-一些特点的话题【抛入抛出关联】
    流程配置中心中的委托设置无法查看全部流程的问题
    验证flash player 是否正常
    kdpkg安装包解压
    go新环境Mac安装,包含okexchain
  • 原文地址:https://www.cnblogs.com/xiu123/p/10204078.html
Copyright © 2011-2022 走看看