zoukankan      html  css  js  c++  java
  • python装饰器

    装饰器实际上就是函数,可以在装饰器中置入通用功能的代码来降低程序的复杂度。

    功能:

    --->引入日志

    --->增加计时逻辑来检测性能

    --->给函数加入事务的能力 

    例子1、简单装饰器

     1 # -*- coding:utf-8 -*-
     2 __author__ = 'webber'
     3 
     4 def decorator(fun):
     5     def wrapper(arg):
     6         print "你好"
     7         fun(arg)
     8         print "world!!"
     9     return wrapper
    10 
    11 
    12             #装饰器通过“@”符号把被装饰的函数和装饰函数建立起了连接,在装饰器中,返回的是整个函数wrapper。
    13             #在程序执行时,首先执行装饰器函数,把decorator内的wrapper读取到内存中,顺便把Func1函数也读到内存中了,然后在执行正常的顺序调用
    14 @decorator  #这里,可以把装饰器看成 @decorator = decorator(Func1) 两个函数
    15 def Func1(arg):
    16     print "装饰器", arg
    17 
    18 Func1("wee")
    19 
    20 '''
    21 这里,相当于 :
    22 Func1=
    23     def wrapper():
    24         print "你好"
    25         fun()
    26         print "world!!"
    27 '''

    例子2、含返回值的装饰器

     1 # -*- coding:utf-8 -*-
     2 __author__ = 'webber'
     3 
     4 def decorator(fun):
     5     def wrapper(arg):
     6         print "你好"
     7         result = fun(arg)
     8         print "world!!"
     9         return result
    10     return wrapper   #这两个return要搞清楚,上一个return返回的是函数执行过程后的返回值,而后一个返回的是整个装饰器加函数的结果
    11 
    12 @decorator
    13 def Func1(arg):
    14     print "装饰器", arg
    15     return "--------> return "
    16 
    17 response = Func1("wee")
    18 print response

    例子3、复杂装饰器

     1 # -*- coding:utf-8 -*-
     2 __author__ = 'webber'
     3 
     4 def Filter(before_func, after_func):
     5     def outer(main_func):
     6         def wrapper(request, kargs):
     7 
     8             before_result = before_func(request, kargs)
     9             if (before_result != None):
    10                 return before_result
    11 
    12             main_result = main_func(request, kargs)
    13             if (main_result != None):
    14                 return main_result
    15 
    16             after_result = after_func(request, kargs)
    17             if (after_result != None):
    18                 return after_result
    19 
    20         return wrapper
    21     return outer
    22 
    23 class AccountFilter(object):
    24     def __init__(self):
    25        pass
    26     def Before(self, request, kargs):
    27         pass
    28     def After(self, request, kargs):
    29         pass
    30 
    31 @Filter(AccountFilter.Before, AccountFilter.After)
    32 def List(request, kargs):
    33     pass

    这里是含参数的装饰器,在装饰器中调用before方法和after方法,完成对List方法装饰之前的功能步骤和装饰之后的功能步骤,相当于上面两个例子中的装饰器中的fun()函数上面和下面的两个print的功能。

    例子4、python核心编程中的例子,给一个函数通用的加了计时逻辑

     1 #-*-coding:utf-8-*-
     2 import time
     3 
     4 def time_fun(func):
     5     def wrapper():
     6         print '[%s]  %s  called' % (time.ctime(), func.__name__)
     7         func()
     8         #return func
     9     return wrapper
    10 
    11 @time_fun
    12 def foo():
    13     print "I am doing my own work!!!"
    14 
    15 foo()
    16 time.sleep(4)
    17 
    18 for i in range(2):
    19     time.sleep(1)
    20     foo()

    输出如下:

    [Sat Oct 08 10:24:46 2016]  foo  called
    I am doing my own work!!!
    [Sat Oct 08 10:24:51 2016]  foo  called
    I am doing my own work!!!
    [Sat Oct 08 10:24:52 2016]  foo  called
    I am doing my own work!!!

    可通过时间判定函数被调用的情况。

  • 相关阅读:
    SpeedPHP多入口设置 前台和后台入口分开
    php重定向 htaccess文件的编写
    SpeedPHP关于一对一和一对多关联关系的建立 model建立
    SpringMVC与Struts2关于controller线程安全问题
    编码问题 关于hibernate jdbc数据库连接在xml配置与在properties文件配置的差异
    SpringMVC可以配置多个拦截后缀*.html和.do等
    JavaSE replaceAll 方法
    Promise.race 的原理
    Promise.all 的原理
    标签联合
  • 原文地址:https://www.cnblogs.com/webber1992/p/5937644.html
Copyright © 2011-2022 走看看