zoukankan      html  css  js  c++  java
  • Python:函数装饰器

    1. 装饰器概述 

      本文不涉及类装饰器。

      装饰器是一个函数。

        通常将函数作为参数传递给装饰器函数。

        装饰器函数通常包含了一个闭包。闭包是函数内部一个函数,在函数内部增加了一个变量局部作用域。通常,装饰器会修改被装饰的函数。

    2. 代码解释

    2.1  函数装饰器用法简述

      装饰器在紧挨着定义一个函数的 def 语句之前一行编写,@符号以及紧随其后的对于元函数的一个引用组成。假如有个名为 decorate 的装饰器

    @decorate
    def target():
    print('running target()')

      上述代码等价于如下代码:

    def target():
    print('running target()')
    target = decorate(target)

    2.2  装饰器通常把被装饰的函数替换为另外一个函数

      让一个函数作为装饰器的关键是其将一个函数作为参数传递给它

    >>> def f1(f):
        def f2():
            print('这是闭包')
        return f2
    
    >>> def f3():
        print('被装饰函数')
    
        
    >>> f3()
    被装饰函数
    >>> f3
    <function f3 at 0x02375588>
    >>> @f1  # 装饰器会将函数f3替换成函数f2
    def f3():
        print('被装饰函数')
    
        
    >>> f3()
    这是闭包
    >>> f3    # 下面这句:f3是f1局部作用域里面函数f2的引用(.号)
    <function f1.<locals>.f2 at 0x023B6DB0>

    2.3  装饰器不修改被装饰函数的情况

      注册函数(待续)......

    2.4  装饰器在加载模块时立即执行

      如果将一个程序作为模块导入另外一个程序(不作为脚本运行),则装饰器将在模块导入时立即运行,详细见《流畅的Python》第七章7.2节。

     

    作者:南宫恨

    正是江南好风景,落花时节又逢君

  • 相关阅读:
    JAVA面试常见问题之开源框架和容器篇
    JAVA面试常见问题之Redis篇
    JDK8日期时间操作小汇总
    JAVA面试常见问题之数据库篇
    JAVA面试常见问题之设计模式篇
    JAVA面试常见问题之锁机制篇
    JAVA面试常见问题之进程和线程篇
    JAVA面试常见问题之常见集合篇
    JAVA面试常见问题之基础篇
    洛谷P1315 观光公交
  • 原文地址:https://www.cnblogs.com/ydkh/p/14680624.html
Copyright © 2011-2022 走看看