ホームページ > バックエンド開発 > Python チュートリアル > Python プログラミングにおけるデコレーターの使用例の分析

Python プログラミングにおけるデコレーターの使用例の分析

WBOY
リリース: 2016-07-21 14:53:16
オリジナル
1298 人が閲覧しました

装飾関数とメソッド

まず 2 つの単純な数学関数を定義します。1 つは二乗和を計算する関数、もう 1 つは二乗の差を計算する関数です。

リーリー
基本的な数学関数を用意した後、入力の出力など、他の関数を関数に追加することもできます。これを実現するために関数を書き直すことができます:

リーリー
関数の定義を修正し、関数に関数を追加しました。

ここで、デコレーターを使用して上記の変更を実装します。

リーリー
デコレーターは、上記のコードのデコレーターなど、def の形式で定義できます。デコレーターは、呼び出し可能オブジェクトを入力パラメーターとして受け取り、新しい呼び出し可能オブジェクトを返します。デコレータは、上記の new_F である新しい呼び出し可能オブジェクトを作成します。 new_F では、印刷関数を追加し、F(a, b) を呼び出すことで元の関数の機能を実装しました。

デコレータを定義した後、@ 構文を通じてそれを使用できます。関数 square_sum および square_diff が定義される前に @decorator を呼び出すことにより、実際には square_sum または square_diff をデコレーターに渡し、デコレーターによって返された新しい呼び出し可能オブジェクトを元の関数名 (square_sum または square_diff) に割り当てます。 したがって、 square_sum(3, 4) を呼び出すと、次と同等になります:

リーリー
Python では変数名とオブジェクトが分離されていることはわかっています。変数名は任意のオブジェクトを指すことができます。本質的に、デコレーターは変数名を再ポイントする役割 (名前バインディング) を果たし、同じ変数名が新しく返された呼び出し可能オブジェクトをポイントできるようにし、それによって呼び出し可能オブジェクトを変更するという目的を達成します。

関数の処理と同様に、デコレータを使用してクラスメソッドを処理できます。

他にも同様の関数がある場合は、関数を繰り返し変更したり、新しいパッケージを追加したりすることなく、引き続きデコレーターを呼び出して関数を変更できます。これにより、プログラムの再利用性が向上し、可読性が向上します。

高麗人参のデコレーション

@decorator などの上記のデコレーター呼び出しでは、デコレーターはデフォルトで唯一のパラメーターとして後続の関数になります。デコレータの構文を使用すると、デコレータを呼び出すときに @decorator(a) などの他のパラメータを指定できます。これにより、デコレータの作成と使用における柔軟性が向上します。

リーリー
上記の pre_str はパラメータを許可するデコレータです。これは実際には元のデコレータをカプセル化した関数であり、デコレータを返します。これは、環境パラメータを含むクロージャとして理解できます。 @pre_str('^_^') を使用して呼び出すと、Python はこのカプセル化層を検出し、パラメータをデコレータ環境に渡すことができます。この呼び出しは次と同等です:

リーリー

デコレーション

上記の例では、デコレータは関数を受け取り、関数を返すため、関数を処理する効果があります。 Python 2.6 以降、デコレータはクラスに拡張されました。デコレータはクラスを受け取ってクラスを返すことができるため、クラスを処理する効果があります。

リーリー
デコレータでは、新しいクラス newClass を返します。新しいクラスでは、元のクラスによって生成されたオブジェクト (self.wrapped) を記録し、display が呼び出された回数を記録するための新しい属性 total_display をアタッチします。同時に表示方法も変更しました。

変更を加えると、Bird クラスはディスプレイが呼び出された回数を表示できるようになります。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート