Python デコレータの詳細
デコレータは本質的に Python 関数であり、コードを変更することなく他の関数が関数を追加できるようになります。デコレータの戻り値も関数オブジェクトです。.
は、ログ挿入、パフォーマンス テスト、トランザクション処理、キャッシュ、権限の検証など、横断的な要件を持つシナリオでよく使用されます。デコレータはこのような問題を解決する優れた設計であり、関数自体とは関係のない類似コードを大量に抽出して再利用し続けることができます。
まず簡単な例を見てみましょう:
def now(): print('2017_7_29')
新しい要件があります。関数の実行ログを記録したいので、ログ コードをコードに追加します。 :
def now(): print('2017_7_29') logging.warn("running")
同様の要件が複数あるとします。どうすればよいでしょうか? now 関数に別のレコードを書き込みますか?これにより、同様のコードが大量に作成されます。コードの繰り返し記述を減らすために、関数を再定義できます。具体的にはログを処理し、ログの処理後に実際のビジネス コードを実行します。
def use_logging(func): logging.warn("%s is running" % func.__name__) func() def now(): print('2017_7_29') use_logging(now)
実装では、は論理的には難しくありませんが、この場合、関数をパラメータとして毎回log関数に渡す必要があります。また、この方法では元のコードの論理構造が破壊されてしまうため、以前はビジネスロジックを実行する際にnow()を実行していましたが、use_logging(now)に変更する必要があります。
では、もっと良い方法はあるでしょうか?もちろん、それはあります。答えはデコレータです。
まず、関数はオブジェクトでもあり、関数オブジェクトは変数に代入できるため、変数を介して関数を呼び出すこともできることを理解する必要があります。例:
(=
単純なデコレータ
本質的に、デコレータは関数を返す高階関数です。したがって、ログを出力できるデコレータを定義する必要があります。これは次のように定義できます。
def log(func): def wrapper(*args,**kw): print('call %s():'%func.__name__) return func(*args,**kw) return wrapper # 由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在, # 只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。 # wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。 # 在wrapper()函数内,首先打印日志,再紧接着调用原始函数。
上記の log
はデコレータであるため、関数をパラメータとして受け取り、関数を返します。Now 実行:
now = log(now) now()
输出结果: call now(): 2017_7_28
Functionlog はデコレータです。実際のビジネス メソッドを実行する func を関数内でラップします。log によって修飾されているように見えます。この例では、関数が入ることをアスペクト(Aspect)と呼び、このプログラミング方法をアスペクト指向プログラミング(Aspect-Oriented Programming)と呼びます。
使用糖鎖構文:
@logdef now(): print('2017_7_28')
@シンボルはデコレーターの糖鎖構文です。別の代入操作を避けるために関数を定義するときに使用されます
Inこのようにして、now = log(now) という文を省略し、now() を直接呼び出して、目的の結果を得ることができます。他に同様の関数がある場合は、関数を繰り返し変更したり、新しいパッケージを追加したりすることなく、引き続きデコレータを呼び出して関数を修飾することができます。これにより、プログラムの再利用性が向上し、可読性が向上します。
デコレータが Python で使用するのに非常に便利である理由は、Python 関数を通常のオブジェクトと同様に他の関数にパラメータとして渡したり、他の変数に代入したり、戻り値として使用したりできるためです。 . 別の関数内で定義できます。
パラメータ付きのデコレータ:
デコレータ自体がパラメータを渡す必要がある場合は、次のような高い値を書き込む必要があります。デコレータを返します。 Order 関数の作成は少し複雑です。たとえば、ログのテキストをカスタマイズするには:
def log(text): def decorator(func): def wrapper(*args,**kw): print('%s %s()'%(text,func.__name__)) return func(*args,**kw) return wrapper return decorator
この 3 層のネストされたデコレータの使用法は次のとおりです:
@log(() now()
は
<span style="color: #000000;">now = log('goal')(now)<br># 首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数<br>now()</span>
と同等です。関数もオブジェクトであると述べていますが、 __name__
のような属性がありますが、デコレータで修飾された関数を見ると、その __name__
は元の ' から変更されています。 now'
から 'wrapper'
:
print(now.__name__)# wrapper
返された wrapper()
関数名は 'wrapper'
であるため、元の関数 ##__name__ の # を変更する必要があり、他の属性は
wrapper() 関数にコピーされます。そうしないと、関数シグネチャに依存する一部のコードが正しく実行されません。
wrapper.__name__ = func.__name__ のようなコードを記述する必要はありません。Python の組み込み
functools.wraps がこれを行うため、完全なデコレータとなります。
import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) return func(*args, **kw) return wrapper
import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator
クラスデコレータ:
クラスデコレータをもう一度見てみましょう 関数デコレータに比べて、クラスデコレータは柔軟性が高く、高含有量、重合、カプセル化などの利点。クラス デコレータを使用すると、クラス内の __call__ メソッドに依存することもできます。@ フォームを使用してデコレータを関数に付加すると、このメソッドが呼び出されます。import time class Foo(object): def __init__(self, func): self._func = func def __call__(self): print ('class decorator runing') self._func() print ('class decorator ending') @Foo def now(): print (time.strftime('%Y-%m-%d',time.localtime(time.time()))) now()
同時に、オブジェクト指向 (OOP) 設計モードでは、デコレーターはデコレーション モードと呼ばれます。 OOP のデコレーション モードは、継承と組み合わせを通じて実装する必要があります。Python は、OOP のデコレーターのサポートに加えて、構文レベルから直接デコレーターもサポートします。 Python のデコレータは関数またはクラスとして実装できます。
さらに関連する知識については、Python ビデオ チュートリアル 列
を参照してください。以上がPython デコレータの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

この記事では、MySQLデータベースの操作を紹介します。まず、MySQLWorkBenchやコマンドラインクライアントなど、MySQLクライアントをインストールする必要があります。 1. mysql-uroot-pコマンドを使用してサーバーに接続し、ルートアカウントパスワードでログインします。 2。CreatedAtaBaseを使用してデータベースを作成し、データベースを選択します。 3. createTableを使用してテーブルを作成し、フィールドとデータ型を定義します。 4. INSERTINTOを使用してデータを挿入し、データをクエリし、更新することでデータを更新し、削除してデータを削除します。これらの手順を習得することによってのみ、一般的な問題に対処することを学び、データベースのパフォーマンスを最適化することでMySQLを効率的に使用できます。

mysqlダウンロードファイルは破損していますが、どうすればよいですか?残念ながら、MySQLをダウンロードすると、ファイルの破損に遭遇できます。最近は本当に簡単ではありません!この記事では、誰もが迂回を避けることができるように、この問題を解決する方法について説明します。それを読んだ後、損傷したMySQLインストールパッケージを修復するだけでなく、将来の行き詰まりを避けるために、ダウンロードとインストールプロセスをより深く理解することもできます。最初に、ファイルのダウンロードが破損した理由について話しましょう。これには多くの理由があります。ネットワークの問題は犯人です。ダウンロードプロセスの中断とネットワーク内の不安定性は、ファイル腐敗につながる可能性があります。ダウンロードソース自体にも問題があります。サーバーファイル自体が壊れており、もちろんダウンロードすると壊れています。さらに、いくつかのウイルス対策ソフトウェアの過度の「情熱的な」スキャンもファイルの破損を引き起こす可能性があります。診断問題:ファイルが本当に破損しているかどうかを判断します

MySQLのインストール障害の主な理由は次のとおりです。1。許可の問題、管理者として実行するか、SUDOコマンドを使用する必要があります。 2。依存関係が欠落しており、関連する開発パッケージをインストールする必要があります。 3.ポート競合では、ポート3306を占めるプログラムを閉じるか、構成ファイルを変更する必要があります。 4.インストールパッケージが破損しているため、整合性をダウンロードして検証する必要があります。 5.環境変数は誤って構成されており、環境変数はオペレーティングシステムに従って正しく構成する必要があります。これらの問題を解決し、各ステップを慎重に確認して、MySQLを正常にインストールします。

MySQLは開始を拒否しましたか?パニックにならないでください、チェックしてみましょう!多くの友人は、MySQLのインストール後にサービスを開始できないことを発見し、彼らはとても不安でした!心配しないでください、この記事はあなたがそれを落ち着いて対処し、その背後にある首謀者を見つけるためにあなたを連れて行きます!それを読んだ後、あなたはこの問題を解決するだけでなく、MySQLサービスの理解と問題のトラブルシューティングのためのあなたのアイデアを改善し、より強力なデータベース管理者になることができます! MySQLサービスは開始に失敗し、単純な構成エラーから複雑なシステムの問題に至るまで、多くの理由があります。最も一般的な側面から始めましょう。基本知識:サービススタートアッププロセスMYSQLサービススタートアップの簡単な説明。簡単に言えば、オペレーティングシステムはMySQL関連のファイルをロードし、MySQLデーモンを起動します。これには構成が含まれます

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

MySQLパフォーマンスの最適化は、インストール構成、インデックス作成、クエリの最適化、監視、チューニングの3つの側面から開始する必要があります。 1。インストール後、INNODB_BUFFER_POOL_SIZEパラメーターやclose query_cache_sizeなど、サーバーの構成に従ってmy.cnfファイルを調整する必要があります。 2。過度のインデックスを回避するための適切なインデックスを作成し、説明コマンドを使用して実行計画を分析するなど、クエリステートメントを最適化します。 3. MySQL独自の監視ツール(ShowProcessList、ShowStatus)を使用して、データベースの健康を監視し、定期的にデータベースをバックアップして整理します。これらの手順を継続的に最適化することによってのみ、MySQLデータベースのパフォーマンスを改善できます。

MySQLは、基本的なデータストレージと管理のためにネットワーク接続なしで実行できます。ただし、他のシステムとのやり取り、リモートアクセス、または複製やクラスタリングなどの高度な機能を使用するには、ネットワーク接続が必要です。さらに、セキュリティ対策(ファイアウォールなど)、パフォーマンスの最適化(適切なネットワーク接続を選択)、およびデータバックアップは、インターネットに接続するために重要です。
