程式語言: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 之很難理解的快速理解法
留言
張貼留言