Python のデザイン パターンとイディオムのコレクション。
各パターンには独自のトレードオフがあることに注意してください。また、特定のパターンをどのように実装するかよりも、そのパターンを選択する理由に注意を払う必要があります。
創作パターン:
パターン | 説明 |
---|---|
抽象工場 | 特定のファクトリで汎用関数を使用する |
ボーグ | インスタンス間で状態を共有するシングルトン |
ビルダー | 複数のコンストラクターを使用する代わりに、ビルダー オブジェクトはパラメーターを受け取り、構築されたオブジェクトを返します。 |
工場 | インスタンスを作成するための特殊な関数/メソッドを委任する |
怠惰な評価 | Python の遅延評価プロパティ パターン |
プール | 同じタイプのインスタンスのグループを事前インスタンス化して維持する |
プロトタイプ | 新しいインスタンスにはファクトリとプロトタイプのクローンを使用します (インスタンス化にコストがかかる場合) |
構造パターン:
パターン | 説明 |
---|---|
3段 | データ<->ビジネス ロジック<->プレゼンテーションの分離 (厳密な関係) |
アダプタ | ホワイトリストを使用して、あるインターフェースを別のインターフェースに適応させる |
橋 | インターフェースの変更を和らげるためのクライアントとプロバイダーの仲介者 |
複合 | クライアントが個々のオブジェクトとコンポジションを均一に扱えるようにします |
デコレータ | 出力に影響を与えるために機能を他の機能でラップする |
ファサード | 1 つのクラスを他の多数のクラスに対する API として使用する |
フライ級 | 類似/同一の状態を持つオブジェクトの既存のインスタンスを透過的に再利用します |
フロントコントローラー | アプリケーションに届く単一ハンドラーリクエスト |
MVC | モデル<->ビュー<->コントローラー (非厳密な関係) |
プロキシ | オブジェクトが操作を他のものに集中させる |
行動パターン:
パターン | 説明 |
---|---|
責任の連鎖 | 連続するハンドラーのチェーンを適用してデータの処理を試みます |
カタログ | 一般的なメソッドは構築パラメータに基づいてさまざまな特殊なメソッドを呼び出します |
連鎖メソッド | continue コールバック次のオブジェクト メソッド |
指示 | 後で呼び出すコマンドと引数をバンドルする |
イテレータ | コンテナを走査してコンテナの要素にアクセスする |
イテレータ (代替含意) | コンテナを走査してコンテナの要素にアクセスする |
仲介者 | 他のオブジェクトに接続し、プロキシとして機能する方法を知っているオブジェクト |
思い出の品 | 以前の状態に戻るために使用できる不透明なトークンを生成します |
観察者 | イベント/データ変更の通知用のコールバックを提供する |
パブリッシュ_サブスクライブ | ソースはイベント/データを 0 個以上の登録済みリスナーにシンジケートします |
レジストリ | 指定されたクラスのすべてのサブクラスを追跡する |
仕様 | ブール論理を使用してビジネス ルールを連鎖させることで、ビジネス ルールを再結合できます。 |
州 | ロジックは、離散的な数の潜在的な状態と、次の状態に移行できるように編成されます。 |
戦略 | 同じデータに対する選択可能な操作 |
テンプレート | オブジェクトは構造を強制しますが、プラグイン可能なコンポーネントを必要とします |
ビジター | コレクションのすべてのアイテムに対してコールバックを呼び出します |
テスト容易性パターンの設計:
パターン | 説明 |
---|---|
依存関係の注入 | 依存関係注入の 3 つのバリエーション |
基本的なパターン:
パターン | 説明 |
---|---|
委任パターン | オブジェクトは 2 番目のオブジェクト (デリゲート) に委任することでリクエストを処理します。 |
その他:
パターン | 説明 |
---|---|
黒板 | 建築モデル、さまざまなサブシステムの知識を集めてソリューションを構築、AI アプローチ - 4 つのパターンの非結合 |
グラフ検索 | グラフ化アルゴリズム - 4 つのパターンの非結合 |
hsm | 階層型ステート マシン - 非ギャング 4 パターン |
Python のデザイン パターン by Peter Ullrich
Sebastian Buczyński - Python にデザイン パターンが必要ないのはなぜですか?
そんなものは必要ありません!
デザインパターンによるプラグイン可能なライブラリ
実装を追加または変更する場合は、次のガイドラインを確認してください。
モジュール レベルの説明を、対応する参照またはその他の有用な情報へのリンクを含む docstring 形式で追加します。
いくつか知っている場合は、「Python エコシステムの例」セクションを追加してください。パターンを現実世界の問題にどのように適用できるかを示します。
facade.py には詳細な説明の良い例がありますが、template.py のような短い説明で十分な場合もあります。
一部のパターンの Python 2 互換バージョンを確認するには、レガシー タグをチェックアウトしてください。
他のすべてが完了したら、README の対応する部分を更新します。
パッチを送信する前に以下を実行してください
black .
これによりコードがリントされます。次に、次のいずれかを行います。
tox
またはtox -e ci37
これにより単体テストが実行されます。詳細については、tox.ini を参照してください。./lint.sh
を使用してください。このスクリプトは、コードを lint してテストします。このスクリプトは、CI パイプラインのアクションを反映します。 flake8
またはpytest
コマンドを手動で実行することもできます。例はtox.ini
にあります。
問題の優先順位付けやプル リクエストには、バグ レポートの再現や、バージョン番号や再現手順などの重要な情報の要求が含まれる場合があります。問題の優先順位付けを開始したい場合、簡単に始める方法の 1 つは、CodeTriage で Python パターンをサブスクライブすることです。
Mutable.ai の人々は、コードベースを認識する AI アシスタントを構築しました。試してみてください