zoukankan      html  css  js  c++  java
  • python中的@

    copy frome:https://blog.csdn.net/weixin_42205776/article/details/89333359

    一、函数修饰符

      '@' 用做函数的修饰符,可以在模块或者类的定义层内对函数进行修饰,

      出现在函数定义的前一行,不允许和函数定义在同一行

      一个修饰符就是一个函数,它将被修饰的函数作为参数,并返回修饰后的同名函数或其他可调用的东西?

      

    要了解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
    了解上述观点后,可以先不用@符号来写一个简单的装饰器

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

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

    @decorate

    def sub(a, b):

        return a-b

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

    示例2:  

     
    1 def square_sum(fn):
     2     def square(*args):
     3         print "1---", args
     4         n = args[0]
     5         # return n*(n-1)*(2*n-1)/6
     6         print "2==", n*(n-1)*(2*n-1)/6
     7         print fn.__name__
     8         fn(n*(n-1)*(2*n-1)/6)
     9         print "*"*15
    10         return fn(n*(n-1)*(2*n-1)/6)
    11     return square
    12 
    13 
    14 @square_sum
    15 def sum_a(a):
    16     print "3=", a
    17     
    18 sum_a(10)

     结果

    1

    2

    3

    4

    5

    6

    1--- (10,)

    2== 285

    sum_a

    3= 285

    ***************

    3= 285

      可以看出,他是先执行修饰器函数,然后有return fn的时候,修饰器下的函数才是生效的,否则函数sum_a 是没有结果的。

    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    用内联取代宏代码
    参数的缺省值
    令人迷惑的隐藏规则
    重载与覆盖
    重载是如何实现的?
    重载的起源
    C++函数的高级特性
    使用调试器逐步跟踪程序
    new/delete 的使用要点
    malloc/free 的使用要点
  • 原文地址:https://www.cnblogs.com/Oude/p/12321932.html
Copyright © 2011-2022 走看看