zoukankan      html  css  js  c++  java
  • python中的修饰符@的作用

    1.一层修饰符

    1)简单版,编译即实现

    在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函数调用时就能够知道是什么时候调用的,但是你不想手动地去给每个函数添加,那么就能够使用该修饰符实现这样的功能,下面举例说明:

    #coding=UTF-8
    import time
    
    def showTime(fn):
        print('calling time : ', time.time())
        fn() #调用传入的参数
    
    @showTime
    def function1():
        print('running function1 ')
    
    @showTime
    def function2():
        print('running function2 ')

    返回:

    calling time :  1567076890.053299
    running function1 
    calling time :  1567076890.0533462
    running function2 

    但是发现showTime()函数这样子写,即使将fn()行调用代码删除,也会在编译时就输出时间信息:

    import  time
    def showTime(fn):
        print('calling time : ', time.time())
    
    @showTime
    def function1():
        print('running function1 ')
    
    @showTime
    def function2():
        print('running function2 ')

    返回:

    calling time :  1567077493.420067
    calling time :  1567077493.420131

    而且这个时候如果调用function1()会报错:

    TypeError: 'NoneType' object is not callable

    2)调用才实现

    如果去希望是在显示调用function1()和function2()函数时才显示时间,正确的写法是:

    import time
    
    def showTime(fn):
        def getTime():
            print('calling time : ', time.time())
            fn() #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
        return getTime
    
    @showTime
    def function1():
        print('running function1 ')
    
    @showTime
    def function2():
        print('running function2 ')
    
    function1()
    function2()

    返回:

    calling time :  1567077669.2308512
    running function1 
    calling time :  1567077669.230927
    running function2 

    3)传入参数

    如果函数中需要传入参数:

    def showTime(fn):
        def getTime(*args):#*args获得fn的参数
            print('args is : ', args) #查看传入的参数
            print('calling time : ', time.time())
            if len(args) > 0:
                fn(args[0]) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
            else:
                fn()
        return getTime
    
    @showTime
    def function1(a):
        print('running function1 ')
        print('a = ', a)
    
    @showTime
    def function2():
        print('running function2 ')
    
    function1(3)
    function2()

    返回:

    args is :  (3,)
    calling time :  1567077936.79216
    running function1 
    a =  3
    args is :  ()
    calling time :  1567077936.792191
    running function2 

    如果想要对传入的参数进行操作:

    import time
    
    def showTime(fn):
        def getTime(*args):#*args获得fn的参数
            print('args is : ', args) #查看传入的参数
            print('calling time : ', time.time())
            if len(args) > 0:
                n = args[0]
                n *= 2
                fn(n) #要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息
            else:
                fn()
        return getTime
    
    @showTime
    def function1(a):
        print('running function1 ')
        print('a = ', a)
    
    @showTime
    def function2():
        print('running function2 ')
    
    function1(3)
    function2()

    返回:

    args is :  (3,)
    calling time :  1567078015.031965
    running function1 
    a =  6
    args is :  ()
    calling time :  1567078015.0320058
    running function2 

    2.如果是双重修饰符

    1)简单版本,编译即实现

    import time
    def sayHello(fn): print(
    'Hello') def showTime(fn): print('calling time : ', time.time()) fn(3) @sayHello @showTime def function1(a): print('running function1 ') print('a = ', a)

    这个编译就会返回:

    calling time :  1567078623.5239282
    running function1 
    a =  3
    Hello

    2)调用才实现

    如果想要以sayHello -> showTime -> function1的顺序,写法就要变为:

    #coding:utf-8
    import time

    def sayHello(fn): def hello(
    *args): print('Hello') fn(*args) # 2 return hello # 1 def showTime(fn): def getTime(*args):#4 *args获得fn的参数 print('args is : ', args) #查看传入的参数 print('calling time : ', time.time()) if len(args) > 0: n = args[0] n *= 2 fn(n) #5 要在修饰符函数中调用传入的函数参数fn,否则function1/function2是不会被调用的,仅仅只输出了时间信息 else: fn() return getTime # 3 @sayHello @showTime def function1(a): # 5 print('running function1 ') print('a = ', a) function1(3)

    等于sayHello(showTime(function1(a))),所以调用function1(3)时运行的顺序为 :

    • 先调用sayHello()返回的hello(3),此时传入的参数*args为(3,),然后调用hello中的fn(*args)
    • 其实就是调用showTime()返回的getTime(3),此时传入的参数*args为(3,),然后调用getTime中的fn(n=6)
    • 其实就是调用function1(6),就结束了

    返回:

    Hello
    args is :  (3,)
    calling time :  1567078847.98264
    running function1 
    a =  6
  • 相关阅读:
    ZOJ Problem Set
    数学之美:生活中的技术
    java泛型【收藏】
    "i=i++"在java等高级语言的解释
    poj1001
    ⑧javaWeb之在例子中学习(过滤器Filter)
    ZOJ Problem Set
    IT十年经典书籍
    ⑦JSP2.0的福利(标签文件)
    myeclipse-common 找不到
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/11431662.html
Copyright © 2011-2022 走看看