どのように本物のpython装飾器を知っていますか?

3024 ワード

装飾器を合理的に使うことで、開発が簡単になり、コードがより明確になります。二つの装飾器を紹介します。パラメータなしの装飾器とパラメータ付きの装飾器を紹介します。
一、パラメータなしの飾り器
実際の例を使って装飾器の概念を導入します。例えば、今は方法A()があります。そして、方法A()が実行される前に端末で「function is running」を印刷する必要があります。この時、方法A()の開始部分に下記のコードを加えることができます。

print("function is running")
しかし、方法A()のコードを修正したくないなら、方法decorator()を書き換えて、A()を参加にしてもいいです。コードは以下の通りです。

def decorator(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        print("Method is running")
        return fun()
    return wrapper
pythonにおける方法は、パラメータとして別の方法に入ることができますので、decorator(A)を実行すると、戻ってくるのは一つの方法です。この方法の本質は、print文を先に実行してからA()を実行します。
しかし、このように私たちのコードを変更する必要があります。つまり、以前の呼び出し方法A()は、現在の書き方ではデコラレータ(A)を呼び出します。

@decorator
def A():
    # do something
実際にはA()の前に行@decoratorを加えるだけで、私達のコードを呼び出す必要がなくなります。
飾り器の中の@functools.wraps(fun)は戻りを保証するための方法です。name_属性と入参法funの_u uname_属性は同じです。
二、持ち込みの飾り器
上記のパラメータなしの装飾器では、メソッドA()を実行する前に固定された文字列を印刷することを実現しました。異なる文字列を印刷するにはパラメータ付きの装飾器が必要です。実際には、パラメータを持たない装飾器にもう一回包装すればいいです。コードは以下の通りです。

def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator
これにより、装飾器を使う時にパラメータnameを設定して、異なる情報を印刷することができます。完全なコードは以下の通りです。

import functools
 
def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator
 
@decorator_par("A")
def A():
    print("I am A")
 
@decorator_par("B")
def B():
    print("I am B")
 
A()
B()
実行出力:

Method A is running
I am A
Method B is running
I am B
方法を変えずにコードを呼び出すと、この方法の前に特定の情報を印刷することができます。
以上が装飾器の2つの実施例であり、実際の開発においても複数の装飾器を入れ子にすることができ、より複雑なニーズを実現することができる。
コンテンツ拡張:
python関数式プログラミングの装飾器
1.開放閉鎖の原則
簡単に言えば、拡張開放に対して、閉鎖を修正することです。
オブジェクト指向プログラミングでは、様々な関数がしばしば定義されます。一つの関数の使用は定義段階と使用段階に分けられ、一つの関数の定義が完了したら、多くの場所で呼び出されるかもしれない。これは関数の定義段階コードが修正されたら、影響を受けるところがたくさんあるということを意味しています。この時は小さいところの修正によってシステム全体の崩壊に影響を与えやすいです。だから、現代のプログラム開発業界にとって、システムのソースコードは一旦オンラインになれば、必ず再変更できなくなります。しかし、一連のシステムがオンラインになってから、ユーザーの数が増えるにつれて、システム拡張のために新しい機能が追加されます。
この時点では、既存のシステムのソースコードを修正することはできません。また、既存のシステムの開発のために新しい機能を追加します。これはプログラム開発業界のオープンクローズの原則です。
2.飾りは何ですか
装飾器とは、その名の通り、飾り、他の対象を飾る道具のことです。
したがって、装飾器は、任意の呼び出し可能なオブジェクトであってもよく、装飾されたオブジェクトは、任意の呼び出し可能なオブジェクトであってもよい。
3.飾り器の役割
装飾されたオブジェクトのソースコードおよび呼び出し方式を変更しないで、装飾されたオブジェクトに新しい機能を追加します。
以上はどのように本物のpython装飾器の詳細を知っていますか?python装飾器についてもっと知りたいです。他の関連記事に注目してください。