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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM