程式語言:Python
功能:簡化程式,可用在計算程式效率或重新撰寫 function,其實就是 closure
用法:@ + function 名字,使用在欲重新定義的 function 前
輸出結果:
decorator using
entry init enter
entry init exit
test start
Entering f
arg: 3
kwarg:
Exited f
9
輸出結果:
decorator using
entry init enter
entry init exit
test start
Entering hello
inside hello
Exited hello
hello world friends
有參數的 Decorator Function
沒有參數的 Decorator Class
有參數的 Decorator Class
參考網站:
Python Decorator 四種寫法範例 Code
[python] decorator 之很難理解的快速理解法
功能:簡化程式,可用在計算程式效率或重新撰寫 function,其實就是 closure
用法:@ + function 名字,使用在欲重新定義的 function 前
兩者意義等同
def logged(func): def with_logging(*args, **kwargs): return func(*args, **kwargs): return with_logging
@logged def f(x): """does some math""" return x * x或者
def f(x): """does some math""" return x * x f = logged(f)
流程
- 重新初始化 function 並回傳 function 且重新定義之
- 直到呼叫 function,才執行重新定義後的 function
- 回傳定義後的值
Decorator Function 測試
def logged(func): print('entry init enter') def with_logging(*args, **kwargs): print("Entering", func.__name__) print("arg:",*args) print("kwarg:",**kwargs) result = func(*args, **kwargs) print("Exited", func.__name__) return result print('entry init exit') return with_logging print('decorator using') @logged def f(x): """does some math""" return x * x print('test start') print(f(3))
輸出結果:
decorator using
entry init enter
entry init exit
test start
Entering f
arg: 3
kwarg:
Exited f
9
Decorator Class 測試
class entryExit(object): def __init__(self, f): print('entry init enter') self.f = f print('entry init exit') def __call__(self, *args, **kwargs): print("Entering", self.f.__name__) r = self.f(*args, **kwargs) print("Exited", self.f.__name__) return r print('decorator using') @entryExit def hello(a): print('inside hello') return("hello world " + a) print('test start') print(hello('friends'))
輸出結果:
decorator using
entry init enter
entry init exit
test start
Entering hello
inside hello
Exited hello
hello world friends
四種寫法
沒有參數的 Decorator Functiondef decorateApple(f): def d_f(*args, **kargs): print("apple before call") result = f(*args, **kargs) print("apple after call") return result return d_f @decorateApple def print_hello(): print("hello first time.") print_hello() #apple before call #hello first time. #apple after call
有參數的 Decorator Function
def decorateFruit(fruit, rotLevel): def outer_d_f(f): def d_f(*args, **kargs): print("%s %s before call" % (rotLevel, fruit)) result = f(*args, **kargs) print("%s %s after call" % (rotLevel, fruit)) return result return d_f return outer_d_f @decorateFruit('banana', 'new') def print_hello2(): print("hello 2nd time.") @decorateFruit('guava', '50% rot') def print_hello3(): print("hello 3th time.") print_hello2() print('') print_hello3() #new banana before call #hello 2nd time. #new banana after call # #50% rot guava before call #hello 3th time. #50% rot guava after call
沒有參數的 Decorator Class
class decorateAppleClass(object): def __init__(self, f): self.f = f def __call__(self, *args, **kargs): print("apple before call") result = self.f(*args, **kargs) print("apple after call") return result @decorateAppleClass def print_hello4(): print("hello 4th time.") print_hello4() #apple before call #hello 4th time. #apple after call
有參數的 Decorator Class
class decorateFruitClass(object): def __init__(self, fruit, rotLevel): self.fruit = fruit self.rotLevel = rotLevel def __call__(self, f): def d_f(*args, **kargs): print("%s %s before call" % (self.rotLevel, self.fruit)) result = f(*args, **kargs) print("%s %s after call" % (self.rotLevel, self.fruit)) return result return d_f @decorateFruitClass('guava', '80% rot') def print_hello5(): print("hello 5th times.") @decorateFruitClass('banana', '30% rot') def print_hello6(): print("hello 6th times.") print_hello5() print('') print_hello6() #80% rot guava before call #hello 5th times. #80% rot guava after call # #30% rot banana before call #hello 6th times. #30% rot banana after call
參考網站:
Python Decorator 四種寫法範例 Code
[python] decorator 之很難理解的快速理解法
留言
張貼留言