Pin-Jiun / Python

Python Document
0 stars 0 forks source link

22-Decorator Factory #22

Open Pin-Jiun opened 1 year ago

Pin-Jiun commented 1 year ago

裝飾器工廠

用來生產裝飾器的function, 可以用來接受額外的參數parameter 多層的裝飾器語法

#定義裝飾器工廠
def decorator_factory(parameter1, parameter2)
    #裝飾器定義
    return test_decorator

#裝飾器輔助的function
@test_decorator(a1, a2)
def f():
    #function code
    print("普通function")

#呼叫帶有裝飾器的function
f()

也就是如下

#定義裝飾器工廠
def decorator_factory(parameter1, parameter2)
    def test_decorator(callbacl_function):
        def inner_function():
            #裝飾器內部程式碼
            print("裝飾器程式範例")
            callbacl_function()
        return inner_function
    return test_decorator

#裝飾器輔助的function
@test_decorator(a1, a2)
def f():
    #function code
    print("普通function")

#呼叫帶有裝飾器的function
f()

實際範例

如果沒有參數傳遞, 可以使用普通裝飾器就好 沒有參數傳遞要使用()

def my_factory():
    def dectory(cb):
        def f():
            print("裝飾器")
            cb()
        return f
    return dectory

@my_factory()
def g_f():
    print("普通函式")

g_f()
裝飾器
普通函式

此時發揮裝飾器工廠的功能:傳遞額外的參數看看

def my_factory(data):
    def dectory(cb):
        def f():
            print("裝飾器", data)
            cb()
        return f
    return dectory

@my_factory(3)
def g_f():
    print("普通函式")

g_f()
裝飾器 3
普通函式

和callback function 進行連結


def my_factory(data):
    def dectory(cb):
        def f():
            print("裝飾器")
            r = data*6
            cb(r)
        return f
    return dectory

@my_factory(10)
def g_f(result):
    print("普通函式", result)

g_f()
裝飾器
普通函式 60

#定義一個裝飾器, 計算1+2+...+max的總和
def calculactor(max):
    def calculate(cb):
        def f():
            #裝飾器內部程式碼
            print("裝飾器程式範例")
            result = 0
            for i in range(max):
                result += i
            cb(result)
        return f
    return calculate

#裝飾器輔助的function
@calculactor(10)
def show(result):
    #function code
    print("計算結果是", result)

@calculactor(20)
def show_in_eng(result):
    #function code
    print("Result is", result)

#呼叫帶有裝飾器的function
show()

show_in_eng()
裝飾器程式範例
計算結果是 45
裝飾器程式範例
Result is 190