【デザインモード】アクセサリーモード--Python実装アクセサリー--閉パッケージ

9363 ワード

文書ディレクトリ
  • 一、閉包
  • 1、何が閉鎖ですか?
  • 2、作用
  • 二、装飾器Decorator
  • 1、概念及び特徴
  • 1.1装飾器概念
  • 1.2原則
  • に従う
  • 1.3利点
  • 1.4欠点
  • 1.5使用シーン
  • 1.6注意事項
  • 1.7デコレータ機能
  • 2、コード実装
  • 2.1被装飾関数無パラメータ関数計時の装飾器:
  • 2.2被装飾関数パラメータタイマ
  • 2.3装飾された関数には不定長パラメータ
  • がある.
    **設計モデル**はベストプラクティスを代表し、通常は経験のあるオブジェクト向けのソフトウェア開発者に採用されています.設計モデルはソフトウェア開発者がソフトウェア開発の過程で直面する一般的な問題の解決策である.
    設計モードは繰り返し使用され、多くの人が知っている、分類編目された、コード設計経験の総括である.設計モードを使用するのは、コードを再利用し、コードを他人に理解されやすくし、コードの信頼性を保証するためです.
    一、閉包
    1、閉包とは何ですか.
    ①関数内部に1つの関数をネストし、②内関数は外関数の局所変数を使用し、③外関数は内関数の参照を返し、閉パケットを構成する
    def outfunc(a, b):
        def innerfunc(x):
            return x * a + b
        return innerfunc  #        ,      
    

    Python 2とPython 3では,内部関数修正外部関数の局所変数に差がある.
    2、作用
    閉包はコードの多重性を高めることができ、
    ただし、閉パッケージが外部関数のローカル変数を参照しているため、外部関数のローカル変数がタイムリーに解放されず、メモリが消費されることに注意してください.
    二、装飾器Decorator
    1、概念と特徴
    1.1装飾品の概念
    デコレーション・モード(Decorator Pattern)を使用すると、既存のオブジェクトに構造を変更せずに新しい機能を追加できます.このタイプの設計モードは構造型モードに属し、既存のクラスのパッケージである.
    このモードは、既存のクラスをパッケージし、クラスメソッドの署名の完全性を維持する前提で、追加の機能を提供する装飾クラスを作成します.
    装飾器があれば,関数機能自体に関係のない類似コードを大量に抽出できる.
    1.2原則に従う の原則に従い、この原則は関数プログラミングにも適用される.
    簡単に言えば、実装された機能コードは修正されないことを規定しているが、拡張することができる.すなわち、
  • クローズド:実装機能コードブロック
  • オープン:拡張開発
  • 1.3利点
    装飾クラスと被装飾クラスは独立して発展することができ、相互に結合することはなく、装飾モードは継承された代替モードであり、装飾モードはクラスを実現する機能を動的に拡張することができる.
    1.4欠点
    多層装飾は複雑です.
    1.5シーンの使用
  • はクラスの機能を拡張します.
  • 動的追加機能、動的取り消し.

  • 1.6注意事項
    継承の代わりに使用できます.
    1.7デコレータ機能
  • 導入ログ
  • 関数実行時間統計
  • 関数前予備処理
  • を実行する.
  • 関数実行後クリーンアップ機能
  • 権限チェック等シーン
  • キャッシュ
  • 2、コード実現
    2.1被装飾関数無パラメータ関数計時の装飾器:
    import time
    
    def timeit(func):
        def innerfunc():
            start = time.time()
            func()
            end = time.time()
            print('Used :', end - start)
    	return innerfunc
    
    @timeit
    def foo():
        for i in range(100000):
            pass
        
    foo()
    
    

    プログラムがデコレーションに実行されると、すぐに次の関数にデコレーションパラメータ付きデコレーションが行われます.
    2.2被装飾関数パラメータタイマー
    from time import ctime, sleep
    
    def timefun(func):
        def wrapped_func(a, b):
            print("%s used at %s" % (func.__name__, ctime()))
            print(a, b)
            func(a, b)
        return wrapped_func
    
    @timefun
    def foo(a, b):
        print(a+b)
    
    foo(5, 3)
    sleep(2)
    foo(3, 5)
    

    2.3装飾された関数に不定長パラメータがある
    from time import ctime, sleep
    
    def timefun(func):
        def wrapped_func(*args, **kwargs):
            print("%s used at %s"%(func.__name__, ctime()))
            func(*args, **kwargs)
        return wrapped_func
    
    @timefun
    def foo(a, b, c):
        print(a+b+c)
    
    foo(2, 5, 7)
    sleep(2)
    foo(2, 6, 8)