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

藏色散人
藏色散人オリジナル
2019-07-04 10:51:008634ブラウズ

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

まず、デコレータとは何ですか?

より正式な説明は次のとおりです:

デコレータは、関数とクラスの管理と呼び出しに使用される呼び出し可能なオブジェクトであり、関数デコレータとクラス デコレータに分けられることを意味します。

# この定義関数を少し単純化しました。そうしないと、理解がさらに難しくなります。実際、デコレータを説明できるより一般的な文があります:

デコレータはオブジェクトを装飾することです。 . (関数、クラス) がリファクタリングされ、元のオブジェクトを変更せずにオブジェクトを呼び出すときにリファクタリングされた動作を実行できます。

ここで混乱して理解できない可能性があります

問題ありません、ゆっくりしましょう! ! !

まず、デコレータの構文を理解する必要があります。

def decorator(f):
    def wrapper(x,y):
        return x+y
    return wrapper
@decorator
def func(x,y):
    return 1
func(3,4)

次に、このコードを見て、上記の内容に基づいていくつかの質問があるかもしれません。

1.デコレータとはどういう意味ですか?

2. ここでのリファクタリングの動作は何ですか?

3. 装飾の動作やプロセス全体はどのようなものですか?

上記のコードを見てみましょう。デコレータは呼び出し可能なオブジェクトであると言いましたが、これは問題ありません。上記のデコレータは関数です。

リファクタリングの動作とは何ですか?

上記のコードのリファクタリング動作は、func の実行コードを Wrapper の実行コードに置き換えることです。つまり、コードの最終入力は 1 ではなく 7 になります。

実のところ、上の 2 つの質問はナンセンスです。3 つ目の質問を解くと、自然に理解できました。

さて、読み続ける前に、一文を覚えておきましょう:

デコレータ自体は装飾されたオブジェクトを受け入れ、デコレータによって返される呼び出し可能オブジェクトは装飾されたオブジェクトのすべてのパラメータを受け入れます

この文を注意深く読んで、理解し、覚えておいてください。

上記のコードでは、

デコレータは次のとおりです:decorator

返される呼び出し可能なオブジェクトは次のとおりです:wrapper

装飾されたオブジェクトは次のとおりです: func

わかりました。最初にこれを実行して、この関数の実行プロセスを確認する必要があります。

もちろん、この時点ではまだ疑問が残ります。

関数を呼び出すときは何をするか(3,4)で起こった?

現時点: 返された呼び出し可能オブジェクト(ラッパー)は func に与えられていますが、現在の func のコードは

def func(x,y):
    return x+y

であることもわかります。この時点では func 自体は定義されていませんファンク、ある意味再構築されたかな?

この時点で、デコレーターとは何か理解できましたか?理解する必要があります。

しかし、これで終わりではありません。デコレーターとは何かを徹底的に理解していただきたいからです。

関数デコレーターだけでなく、クラス デコレーターもあると前に述べました。次に、クラス デコレーターがどのように機能するかを見てみましょう。前の段落をここに投稿したいと思います。忘れないでください。

デコレータ自体は装飾されたオブジェクトを受け入れ、デコレータによって返される呼び出し可能オブジェクトは装飾されたオブジェクトのすべてのパラメータを受け入れます

class Decorator:
    def __init__(self,f):
        self.func = f
    def __call__(self,x,y):
        return self.func(x,y) + 1
@Decorator
def func(x,y):
    return x+y
func(3,4)
# 你来想想这时候的结果是什么?

これを段階的に分析してみましょう。

まず、特に、デコレータは装飾されたオブジェクトのみをパラメータとして受け入れると言います。これは、現時点では ? が存在することを意味します。

それを考えることができれば、デコレータが何であるかは基本的に理解できます。

関連する推奨事項: 「

Python チュートリアル

以上がPythonデコレータとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。