zoukankan      html  css  js  c++  java
  • 飘逸的python

    很多人把装饰器搞的很复杂,其实本质很简单.

    首先,什么是装饰器呢?在代码中发现戴着@xxx帽子的,就是装饰器.

    那要怎么自己定义一个装饰器呢?

    其实任何一个接收一个参数的callable都可以用来做装饰器,比如函数和类.为方便起见,下面的例子都用函数来说明.

    1 def deco(func):return 1  

    这里,deco就可以做装饰器

    1 @deco  
    2 def f(args):pass

    "戴帽"其实就是调用,帽子戴在谁(一个函数定义)头上,就表示将谁作参数来调用,然后赋给一个同名变量.

    上面的例子等价于f = deco(f).结果是函数f变成了1.

    当然,我们用装饰器可不是用来返回1的.我们主要目的是"保持原有函数功能,增加额外功能".

    那我们就定义一个装饰器"接收一个函数作参数并返回一个函数".

    1 def deco(func): return func 

    这样我们可以在return func之前加代码做手脚增强功能,但是如果还需要在执行func后做手脚呢?还需要捕获func的参数args做手脚呢?于是我们用另外一个函数来包装.

    得益于"函数是一等公民",我们可以在函数里面定义函数.这就是装饰器最常用的定义形式,形式如下

    1 def deco(func):  
    2     def newfunc(*args, **kwargs):   
    3         func(*args, **kwargs)  
    4     return newfunc 

    其中*args, **kwargs用来捕获参数.

    我们要在函数执行前后输出信息,只需要

    1 ef deco(func):  
    2     def newfunc(*args, **kwargs):  
    3         print 'before'  
    4         ret = func(*args, **kwargs)  
    5         print 'after'  
    6         return ret  
    7     return newfunc  

    理解了本质后,什么乱七八糟的"不带参数的装饰器"/"带参数的装饰器"/"函数装饰器"/"类装饰器"/"多个装饰器"/"为什么@route能自动收集url"等等等等都是表象了.

    带参数的装饰器?

    你把它当作一个函数调用就行了

    转自:http://blog.csdn.net/handsomekang/article/details/39997163

  • 相关阅读:
    [原] 秋叶原随景
    ReportViewer不连接数据库,自定义DataSet导出到报表
    【程序人生】一个程序员对学弟学妹建议(转)
    c#钩子学习笔记(一)
    解决关于多客户端操作数据库并发问题
    SQL Server 存储过程
    有关抽奖的一个算法
    c#发送邮件含附件
    CrystalReport不连接数据库,自定义DataSet导出到水晶报表
    c#钩子学习笔记(二)
  • 原文地址:https://www.cnblogs.com/lpxblog/p/7267983.html
Copyright © 2011-2022 走看看