Python的帶引數和無引數decorator

2021-08-14 04:17:35 字數 1752 閱讀 9026

python的decorator,有帶引數和無引數兩種,帶引數的decorator採用了三層巢狀,使用 decorator 用python提供的 @ 語法,這樣可以避免手動編寫 f = decorate(f) 這樣的**。

#無參的decorator

import time

def performance(f):

def fn(*args, **kw):

t1 = time.time()

r = f(*args,**kw)

t2 = time.time()

print 'call %s() in %fs' % (f.__name__,(t2 - t1))

return r

return fn

@performance

def factorial(n):

return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

#帶參的decorator

import time

def performance(unit):

def performance_dec(f):

def fn(*args, **kw):

t1 = time.time()

r = f(*args,**kw)

t2 = time.time()

t = (t2-t1)*1000 if unti == 'ms' else (t2-t1)

print 'call %s in %fs' % (f._name_,(t2-t1),unit)

return r

return fn

return performance_dec

@performance('ms')

def factorial(n):

return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

#@decorator可以動態實現函式功能的增加,但是,經過@decorator「改造」後的函式,和原函式相比,函式名變了,這對於那些依賴函式名的**就會失效。

#decorator還改變了函式的__doc__等其它屬性。如果要讓呼叫者看不出乙個函式經過了@decorator的「改造」,就需要把原函式的一些屬性複製到新函式中,

#所以用了@functools來自動複製函式名和函式的其它屬性,但是函式的引數名還是會改變。

import time, functools

def performance(unit):

def perf_decorator(f):

@functools.wraps(f)

t1 = time.time()

r = f(*args, **kw)

t2 = time.time()

t = (t2-t1)*1000 if unti == 'ms' else (t2-t1)

print 'call %s in %fs' % (f._name_,(t2-t1),unit)

return r

return perf_decorator

@performance('ms')

def factorial(n):

return reduce(lambda x,y: x*y, range(1, n+1))

print factorial.__name__

對比有引數和無引數

有引數 小括號當中有內容,當乙個方法需要一些資料條件,才能完成任務的時候們就是有引數,如 兩個數字相加,必須知道兩個數字各自多少,才能相加。裡面有方法,但沒有引數,需要外加資料 無引數 小括號當中留空,乙個方法不需要任何資料條件,自己就能獨立完成任務,就是無引數。裡面有方法,也有資料 但需要你呼叫 ...

Python 指令碼帶引數

如果想對python指令碼傳引數,python中對應的argc,ar c語言的命令列引數 是什麼呢?需要模組 sys 引數個數 len sys.ar 指令碼名 sys.ar 0 引數1 sys.ar 1 引數2 sys.ar 2 test.py import sys print 指令碼名 sys.a...

帶引數方法和不帶引數方法

方法分為帶引數不帶引數兩種 a不帶引數 public void showinfo b帶引數方法 public void showinfo intname,string str 結論 1方法定義處,引數叫形式引數,也叫形參 主要用來約束引數型別的 形參的名字可以隨便取,但要符合駝峰命名規則,同時要有意...