pythonアクセサリー、自分で簡単なアクセサリーを実現
6142 ワード
装飾器の進化過程
1.まず方法を見てみましょう.
その機能は明らかで、1つの加算を実現して、bossはこの機能があまりにも単一だと思って、いくつかの機能1を追加する必要があります(pythonは強いタイプの言語なので、intとstringは直接加算できません.)2.加算ファイルに出力などの操作.
2.そこで、修正コードは以下のようになります.これも修正コードの最も一般的なものです.
このような弊害は二つある.プログラムの高凝集低結合原則2を破壊し、加算器関数は味を変えた.
3.soはpythonの参照特性に基づいて加算器を高度な関数(パラメータor戻り値は関数)にカプセル化し、ここでadd関数をパラメータとして入力します.コードは以下の通りです.
4.関数のパラメータx,yは関数にカプセル化されていないので、修正コードは以下の通りです.
5.多重性を高めるためにaddの3つのパラメータの場合、loggeを可変のパラメータに変更する
6.コリー化後のコードは以下の通りである.
7.最終的に私達は1つの装飾器を見て、使う時元の方法の上で@装飾器の名前をプラスして、完全なコードは以下の通りです:
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)