zoukankan      html  css  js  c++  java
  • 关于python当中的@修饰符的浅析

    https://blog.csdn.net/class_brick/article/details/81170697

     
     

    要了解python中@装饰器的作用,首先要记住这么几点:

    1. 装饰器符号“@”属于语法糖,什么意思呢?就是说,我不按照@装饰器的语法要求来写,而是按照一般python的语法要求来写完全可以。那么用@装饰器的格式来写的目的就是为了书写简单方便

    2. 装饰器的作用是什么呢? 简单的理解就是:装饰原有的函数。什么意思呢?比如有一个函数func(a, b),它的功能是求a,b的差值,我现在有一个需求,就是想对函数功能再装饰下,求完差值后再取绝对值,但是不能在func函数内部实现,这时候就需要装饰器函数了,比如func = decorate(func)函数,将func函数作为参数传递给decorate函数,由decorate来丰富func函数,丰富完成后再返回给func,此时func的功能就丰富了。

    3.python的常识,函数和其他任何东西一样,都是对象。这意味着可以将函数当做实参传递给函数,或者在函数中将函数作为返回值返回。例码验证:

    >>> def add(x, y):

    ...     return x + y

    >>> def sub(x, y):

    ...     return x - y

    >>> def apply(func, x, y): # 1

    ...     return func(x, y) # 2

    >>> apply(add, 2, 1) # 3

    3

    >>> apply(sub, 2, 1)

    1

    了解上述观点后,可以先不用@符号来写一个简单的装饰器

    def decorate(func):

        def inner(a, b):

            ret = func(a, b):

            return abs(ret)

        return inner

    def sub(a, b):

        return a-b

    >>>sub(3, 4)

    ...    -1

    >>>sub = decorate(sub)

    >>>sub(3, 4)

    >>>1

    对于sub = decorate(sub)的理解。  最终会将inner的值传给sub ,此时执行sub(3, 4),其实是执行decorate中的inner,所以为1.

    那么为了书写方便,将sub=decorate(sub)换为@decorate,并放在sub的定义面前,即:

    @decorate

    def sub(a, b):

        return a-b

    只是书写不同,结果相同。

    如果上述理解还是很吃力,推荐一个更详细的帖子,看完后你会有更透彻的理解。

    http://python.jobbole.com/85056/

  • 相关阅读:
    python第二十四课——set中的函数
    python第二十三课——dict中的函数
    python第二十二课——list函数
    10 编译PHP并与nginx整合
    09 nginx Rewrite(重写)详细解析
    07 nginx Location之正则匹配
    06 nginx Location详解之精准匹配
    JQ 修改样式
    05 nginx定时任务完成日志切割
    linux 时间与本地时间不对应解决办法
  • 原文地址:https://www.cnblogs.com/DicksonJYL/p/9429623.html
Copyright © 2011-2022 走看看