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方法定義處,引數叫形式引數,也叫形參 主要用來約束引數型別的 形參的名字可以隨便取,但要符合駝峰命名規則,同時要有意...