pythonアクセサリー、自分で簡単なアクセサリーを実現

6142 ワード

装飾器の進化過程
1.まず方法を見てみましょう.
    def add(x,y):       

        return x+y

その機能は明らかで、1つの加算を実現して、bossはこの機能があまりにも単一だと思って、いくつかの機能1を追加する必要があります(pythonは強いタイプの言語なので、intとstringは直接加算できません.)2.加算ファイルに出力などの操作.
2.そこで、修正コードは以下のようになります.これも修正コードの最も一般的なものです.
def add(x,y):
    if type(x)!=type(y):
        print("        ")
        return
    z=x+y
    f=open('C:\\Users\\Public\\Documents\\test.txt','w')
    f.write(str(z))
    f.close()
    print("finish")

add(2,3)

このような弊害は二つある.プログラムの高凝集低結合原則2を破壊し、加算器関数は味を変えた.
3.soはpythonの参照特性に基づいて加算器を高度な関数(パラメータor戻り値は関数)にカプセル化し、ここでadd関数をパラメータとして入力します.コードは以下の通りです.
def add(x,y):
    return x+y

def logger(fn):
    if type(x)!=type(y):
        print("        ")
        return
    z=fn(x,y)
    f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
    f.write(str(z))
    f.close()
    print("finish")
x,y=4,7
logger(add)

4.関数のパラメータx,yは関数にカプセル化されていないので、修正コードは以下の通りです.
def logger(fn,x,y):
    if type(x)!=type(y):
        print("        ")
        return
    z=fn(x,y)
    f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
    f.write(str(z))
    f.close()
    print("finish")

logger(add,5,8)

5.多重性を高めるためにaddの3つのパラメータの場合、loggeを可変のパラメータに変更する
def logger(fn,*args,**kwargs):
    if type(args[0])!=type(args[1]):
        print("        ")
        return
    z=fn(*args,**kwargs)
    f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
    f.write(str(z))
    f.close()
    print("finish")

logger(add,5,8)

6.コリー化後のコードは以下の通りである.

def logger(fn):
    def wrapper(*args,**kwargs):
        if type(args[0]) != type(args[1]):
            print("        ")
            return
        z = fn(*args, **kwargs)
        f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
        f.write(str(z))
        f.close()
        print("finish")
    return wrapper

logger(add)(4,1)

7.最終的に私達は1つの装飾器を見て、使う時元の方法の上で@装飾器の名前をプラスして、完全なコードは以下の通りです:
 def logger(fn):
    def wrapper(*args,**kwargs):
        if type(args[0]) != type(args[1]):
            print("        ")
            return
        z = fn(*args, **kwargs)
        f = open('C:\\Users\\Public\\Documents\\test.txt', 'w')
        f.write(str(z))
        f.close()
        print("finish")
    return wrapper

@logger # add1 = logger(add1)
def add(x,y):
    ret = x + y
    return ret

add(12,56)