zoukankan      html  css  js  c++  java
  • 流动python

    好多人搞非常复杂的装饰,其实本质easy.

    首先,这是什么装饰?发现穿着在代码@xxx帽子,它是装饰.

    它是由如何定制它装饰?

    其实不管什么人需要一个参数callable用来做装饰器,比方函数和类.为方便起见,以下的样例都用函数来说明.

    def deco(func):return 1

    这里,deco就能够做装饰器.

    @deco
    def f(args):pass

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

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

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

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

    def deco(func): return func

    这样我们能够在return func之前加代码做手脚增强功能,可是假设还须要在运行func后做手脚呢?

    还须要捕获func的參数args做手脚呢?于是我们用另外一个函数来包装.

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

    def deco(func):
        def newfunc(*args, **kwargs): 
            func(*args, **kwargs)
        return newfunc

    当中*args, **kwargs用来捕获參数.

    我们要在函数运行前后输出信息,仅仅须要

    def deco(func):
        def newfunc(*args, **kwargs):
            print 'before'
            ret = func(*args, **kwargs)
            print 'after'
            return ret
        return newfunc

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


    带參数的装装饰设备?

    你把它当作一个函数调用


    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    java之集合Collection详解之3
    委托的高级使用
    委托的一般使用
    泛型(Generic)委托
    泛型(Generic)方法(函数,算法)
    泛型(Generic)接口
    泛型(Generic)类的使用原因和使用方式
    C#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)
    反射应用——依赖注入
    接口的显式实现
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4639020.html
Copyright © 2011-2022 走看看