12日目 - 閉鎖機能、装飾

閉鎖機能

  • 閉鎖手段:外部参照の内部機能の機能、およびグローバルスコープのない範囲です。

  • 方法の関数として伝送パラメータの二種類:パラメータの形式で、パケット関数

def f1(x):
    def f2():
        print(x)
    return f2
    
f = f1(5)  # f-->f2,x=5
f()  # f()-->f2(),x=5  # 5
f()  # 5


f3 = f1(3)  # f-->f2,x=3
f3()  # f()-->f2(),x=3  # 3
f3()  # 3
  • 2は、リターンを一緒に行くように、内部関数に定義された内部変数
  • 階層を破る、ローカル変数は、グローバルに慣れると、外部変数xのF2​​にパッケージ化することができ、その後、次回は、直接、F2を呼び出すことができるようになります
  • アプリケーション:遅延計算(質量参加は、私たちが今包まれていることが判明)、爬虫類フィールド。

デコレーター

1.デコレータとは何ですか?

デコレータはデコレータオブジェクトに機能を追加するために参照します。このような定義は、デコレータ関数を定義することであるが、関数の機能は、装飾的な機能を有する他の機能に使用されます。

それに注意してください。

  • デコレータ自体は実際に呼び出すことができる任意のオブジェクトにすることができます
  • 装飾オブジェクトは、任意の呼び出し可能オブジェクトすることができ
2.なぜデコレータを使うのか?

私たちはライン上のプロジェクトを持っている場合は、我々は特定のメソッドを変更する必要がありますが、我々は、使用方法、あなたはデコレータを使用することができます。この時間を変更する必要はありません。ソフトウェアの保守がオープンクローズの原則に従わなければならないので、ソフトウェアのソースコードのソフトウェアのオンライン操作、保守および修正が閉じられると、拡張機能は、オープンを参照していること。

デコレータを達成するための2つの原則に従う必要があります。

  1. 装飾された対象物のソースコードを変更しません
  2. コールは、装飾品の仕方を変更しません

実際にデコレータは、上記の2つの原則を以下の前提の下で飾られるオブジェクトに新機能を追加します。

  • デコレータは:オリジナルの呼び出しを変更しない時間の関数を変更し、元の関数のコードを変更します
要約:
  • デコレータを呼び出し、睡眠にパラメータとして渡さ

  • ラッパー関数は、名前だけラッパーを返したときにインテリアデコレーターのみ定義された関数や機能を返すので、呼び出し元の関数は実行されません

  • 関数オブジェクトの概念を使用すると、元のラッパー関数名に名前を割り当てるために同等の本来の装飾関数名に割り当てられています

  • 機能ラッパーインテリアデコレーターを呼び出すに相当する時間の関数+()の実装の元の名前

  • 可変細長いラッパー関数パラメータの参加者は、機能の着信元の名前場合、最も内側の層は、直接元の関数を呼び出すことができ、すべての着信および内側層に割り当てられた外側の装飾的な機能を受信します

  • 関数の最も内側の層は、代入の代わりに、直接呼び出されるので、コードが直接実行されます

  • 必要に応じて、最も内側の関数(元関数)の変数に割り当てることができる一方、ラッパー関数は、ラッパーに返された値を機能を追加することができ内では、外側の層の機能を利用することができます


def deco(func):
    def wrapper(*args,**kwargs):  # 赋值后的time_sleep
        res = func(*args,**kwargs)  # 真正的time_sleep
        
        return res
    return wrapper

@deco  # time_sleep(赋值后的) = deco(time_sleep(真正的))
def time_sleep(name):
    print(name)
    return 123

いいえ参照デコレータありません

is_login_dict = {'username': None}


def login_deco(func):
    
    def wrapper(*args, **kwargs):  # 赋值后的time_sleep

        if not is_login_dict['username']:

            username = input('请输入你的用户名》》》').strip()

            if username != 'fanping':
                print('非法登录')

                return

            is_login_dict['username'] = username

            res = func(*args, **kwargs)  # 真正的time_sleep

            return res
        else:
            res = func(*args, **kwargs)  # 真正的time_sleep

            return res         

    return wrapper


@login_deco
def shopping():
    print('from shopping')


@login_deco
def withdraw():
    print('from withdraw')

パラメータデコレータがあります。

is_login_dict = {'username': None}

def auth(origin):
    
    def login_deco(func):

        def wrapper(*args, **kwargs):  # 赋值后的time_sleep

            if origin == 'file':

                if not is_login_dict['username']:

                    username = input('请输入你的用户名》》》').strip()

                    if username != 'fanping':
                        print('非法登录')

                        return

                    is_login_dict['username'] = username

                    res = func(*args, **kwargs)  # 真正的time_sleep

                    return res
                else:
                    res = func(*args, **kwargs)  # 真正的time_sleep

                    return res

            elif origin == 'mongodb':
                print('非法登录')
                
            else:
                print('dsb')


        return wrapper
    
    return login_deco


# f = origin('file')  # login_deco
# shopping = f(shopping)
# shopping()


@auth('file')
def shopping():
    print('from shopping')


@auth('mongodb')
def withdraw():
    print('from withdraw')

おすすめ

転載: www.cnblogs.com/zhuyuanying123--/p/10957090.html