pythonの閉パッケージ関数と装飾器
3104 ワード
1.クローズ関数
役割ドメインの関係:
役割ドメイン関係は、呼び出し位置に関係なく、関数定義フェーズで固定されます.
すなわち,任意の位置で関数を呼び出すには定義関数に駆け込む必要がある場合に役割ドメイン関係を探す.
閉包関数:
閉とは、この関数が内部関数であることを意味します.
パッケージとは、外部役割ドメイン(非グローバル役割ドメイン)の名前への参照==(すなわち、パラメータ変数名の付与参照)を含む関数を指します.
関数に値を渡すには、次の2つの方法があります.
方法1:
パラメータの形式の使用
def inner(x):
print(x)
inner(x)
方式2:
関数にパッケージ
def outter(x):パラメータx=1賦値
def inner():
print(x)
return inner
f=outter(1)ourret(1)関数の最後の実行結果はinnerのメモリアドレスであり、fに付与される
f()f()直接呼び出しinner関数
2.アクセサリー
1.デコレーションとは
器はツールを指し、プログラムにしかない関数にある機能を備えるツール
装飾とは、被装飾オブジェクトに追加機能を追加することです.
装飾テンプレート:
現在のところ、
デザイナの定義は関数を定義することですが、この関数の機能は他の関数に追加の機能を追加するために使用されます.
実際:
アクセラレータ自体は任意の呼び出し可能なオブジェクトであってもよい
装飾されたオブジェクトは任意の呼び出し可能なオブジェクトであってもよい
ソフトウェアの保守はオープン・クローズの原則に従う
オープンクローズの原則は、ソフトウェアがオンラインで実行されると、ソースコードの修正がクローズされ、拡張機能がオープンになることを意味します.この時はアクセサリーを使いました
装飾器の実現は2つの原則に従わなければならない.
1.被装飾オブジェクトのソースコードを変更しない
2.被装飾オブジェクトの呼び出し方法を変更しない
装飾器は1と2の原則に従う前提の下で歌の装飾の対象のために新しい機能を追加します
デコライザでパラメータを伝達する必要がある場合は,以前の可変長パラメータの応用が必要となる.
*args,*keargs関数パラメータはパラメータをそのまま内部関数に転送します.
装飾器文法糖:
被装飾オブジェクトの上に、かつ単独行に@装飾器名を書く
import time#def timmer(func):#func=最も原始的なindex#def wrapper(*args,**kwargs):start=time.time() # res=func(*args,**kwargs) # stop=time.time() # print('run time is %s' %(stop - start)) # return res # return wrapper## @timmer # index=timmer(index)# def index():# print('welcome to index')# time.sleep(3)# return 123## @timmer # home=timmer(home) # def home(name):# print('welcome %s to home page' %name)# time.sleep(2)## res=index()# home('egon')
転載先:https://www.cnblogs.com/Marcki/p/10111964.html
役割ドメインの関係:
役割ドメイン関係は、呼び出し位置に関係なく、関数定義フェーズで固定されます.
すなわち,任意の位置で関数を呼び出すには定義関数に駆け込む必要がある場合に役割ドメイン関係を探す.
閉包関数:
閉とは、この関数が内部関数であることを意味します.
パッケージとは、外部役割ドメイン(非グローバル役割ドメイン)の名前への参照==(すなわち、パラメータ変数名の付与参照)を含む関数を指します.
関数に値を渡すには、次の2つの方法があります.
方法1:
パラメータの形式の使用
def inner(x):
print(x)
inner(x)
方式2:
関数にパッケージ
def outter(x):パラメータx=1賦値
def inner():
print(x)
return inner
f=outter(1)ourret(1)関数の最後の実行結果はinnerのメモリアドレスであり、fに付与される
f()f()直接呼び出しinner関数
2.アクセサリー
1.デコレーションとは
器はツールを指し、プログラムにしかない関数にある機能を備えるツール
装飾とは、被装飾オブジェクトに追加機能を追加することです.
装飾テンプレート:
def timmer(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
#
# , @
現在のところ、
デザイナの定義は関数を定義することですが、この関数の機能は他の関数に追加の機能を追加するために使用されます.
実際:
アクセラレータ自体は任意の呼び出し可能なオブジェクトであってもよい
装飾されたオブジェクトは任意の呼び出し可能なオブジェクトであってもよい
ソフトウェアの保守はオープン・クローズの原則に従う
オープンクローズの原則は、ソフトウェアがオンラインで実行されると、ソースコードの修正がクローズされ、拡張機能がオープンになることを意味します.この時はアクセサリーを使いました
装飾器の実現は2つの原則に従わなければならない.
1.被装飾オブジェクトのソースコードを変更しない
2.被装飾オブジェクトの呼び出し方法を変更しない
装飾器は1と2の原則に従う前提の下で歌の装飾の対象のために新しい機能を追加します
import time
def index():
print('welcom to index')
time.sleep(3)
def timmer(func):
# func=index
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s'(stop-start))
return wrapper
index=timmer(index) #index=wrapper
index()
デコライザでパラメータを伝達する必要がある場合は,以前の可変長パラメータの応用が必要となる.
*args,*keargs関数パラメータはパラメータをそのまま内部関数に転送します.
import time
def index():
print('welcome to index')
time.sleep(3)
return 123
def home(name):
print('welcome %s to name'%(name))
def timmer(func):
def wepper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print('run time is %s' % (stop - start))
return res
return wepper
index = timmer(index)
home = timmer(home)
index()
home('egon')
装飾器文法糖:
被装飾オブジェクトの上に、かつ単独行に@装飾器名を書く
import time#def timmer(func):#func=最も原始的なindex#def wrapper(*args,**kwargs):start=time.time() # res=func(*args,**kwargs) # stop=time.time() # print('run time is %s' %(stop - start)) # return res # return wrapper## @timmer # index=timmer(index)# def index():# print('welcome to index')# time.sleep(3)# return 123## @timmer # home=timmer(home) # def home(name):# print('welcome %s to home page' %name)# time.sleep(2)## res=index()# home('egon')
転載先:https://www.cnblogs.com/Marcki/p/10111964.html