デコレーション


装飾師とは何ですか。


ある関数を別の関数が実行される前に自動的に最初に実行できる構文.
関数を受信してコマンドを追加し、関数の形式の関数として返します.
関数を変更せずに他の機能を実装するために使用します.

アクセサリーを使う

def decorator(func):
    def wrapper():                           
        print("start")   
        func()                       
        print("end")   
    return wrapper                          
    
@decorator
def func():
    print('func')               
    
func()

実行結果

start
func
end
上の図に示すように、レコーダは関数を囲む形で構成されています.
従って、既存の関数を変更しない場合には、付加機能を実施する際に、レコーダが用いられる.

パラメータ付きレコーダ

def multiple(x):
    def real_decorator(func):
        def wrapper(a, b):
            r = func(a, b)
            print(r*x)
            return r*x
        return wrapper
    return real_decorator


@multiple(3)
def add(a, b):
    return a+b


add(10, 20)

実行結果

90

クラスとして使用


クラスを使用する場合は、__call__メソッドを実装する必要があります.__call__:呼び出し可能なオブジェクトにする関数.
class Decorator:

    def __init__(self, function):
        self.method = function

    def __call__(self):
        print('start')
        self.method()
        print('out')


@Decorator
def func():
    print('func')


func()

実行結果

start
func
end

パラメータ付きレコーダ

class IsMultiple:
    def __init__(self, x):
        self.x = x

    def __call__(self, func):
        def wrapper(a, b):
            r = func(a, b)
            return r*self.x
        return wrapper


@IsMultiple(3)
def add(a, b):
    return a + b


add(10,20)

実行結果

90