pythonデザインパターン[終了]


166

Pythonを使用したベストプラクティス、デザインパターン、SOLID原則の例を提供するリソースを探しています。



回答:


152

これらの一部が重複しています

Pythonの中級および上級ソフトウェア大工

Pythonのようなコード:慣用的なPython

Pythonイディオムと効率

Google Developers Day US-Pythonデザインパターン

別のリソースは、Pythonレシピの例です。適切な数はベストプラクティスに従っていませんが、役立つパターンがいくつかあります。


1
3番目のリンクは死んでいます。ミラーを見つけようとしましたが、できませんでした。正しいリンクを持っている人がいる場合は、追加してください
formatkaka

1
ここでも同じですが、Python Idioms and Efficiencyは機能していないようです。
Dawid Laszuk 2017年

最初と2番目のリンクは機能していなかったので、インターネットアーカイブのスナップショットで更新しました。それらの多くはまだ関連性があると確信していますが、それらは非常に古いようです。
mannykary

24

タイプ

>>> import this

Pythonコンソールで。

これは通常(細かい!)ジョークとして扱われますが、有効なpython固有の公理がいくつか含まれています。



6

ここここから始めることができます

デザインパターンの詳細については、「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」を参照してください。ソースコードはPythonではありませんが、パターンを理解する必要はありません。


8
デザインパターンを実装するために慣用的なpythonを使用する方法を理解することが重要だと思います。これは、GOFで使用されるC ++とは非常に異なる言語であるため、C ++からpythonに移植すると、Python以外のコードが生成されます。
sakisk 2011

1
私は反対する傾向があります。シングルトンDPまたは他のDPは、Python、Java、C ++のいずれのオブジェクト言語でも可能です。あなたの意見では非Pythonicは何ですか?
ポールHiemstra

1
最初のリンクはかなり貧弱な論文であり、Pythonに関する多くの誤った主張があります。2番目は現在404なので、ダメージははるかに少ないと思います:)
Brandon Rhodes

6

存在する場合と存在しない場合があるオブジェクトの属性を呼び出すときにコードを簡略化するために使用できるものの1つは、NullオブジェクトデザインパターンPythonクックブックで紹介したもの)を使用することです。

大まかに言って、Nullオブジェクトの目的は、Pythonでよく使用されるプリミティブデータ型Noneまたは他の言語でNull(またはNullポインタ)の「インテリジェント」な置き換えを提供することです。これらは、他の類似した要素のグループの1つのメンバーが何らかの理由で特別であるという重要なケースを含む、多くの目的で使用されます。ほとんどの場合、これにより、通常の要素とプリミティブのNull値を区別するための条件ステートメントが生成されます。

このオブジェクトは属性の欠如エラーを食べるだけであり、それらの存在のチェックを回避できます。

それ以外の何物でもない

class Null(object):

    def __init__(self, *args, **kwargs):
        "Ignore parameters."
        return None

    def __call__(self, *args, **kwargs):
        "Ignore method calls."
        return self

    def __getattr__(self, mname):
        "Ignore attribute requests."
        return self

    def __setattr__(self, name, value):
        "Ignore attribute setting."
        return self

    def __delattr__(self, name):
        "Ignore deleting attributes."
        return self

    def __repr__(self):
        "Return a string representation."
        return "<Null>"

    def __str__(self):
        "Convert to a string and return it."
        return "Null"

これを使用Null("any", "params", "you", "want").attribute_that_doesnt_exists()すると、爆発することはありませんが、静かにと同等になりpassます。

通常、あなたは次のようなことをします

if obj.attr:
    obj.attr()

これで、あなたはただ行う:

obj.attr()

それを忘れてください。Nullオブジェクトを広範囲に使用すると、コード内のバグを隠す可能性があることに注意してください。


3

動的オブジェクト指向言語(つまりPython)のデザインパターンについて説明しているこの記事(.pdfファイルを選択)もご覧ください。ページを引用するには:

このペーパーでは、「Gang of Four」または「GOF」という本のパターンは、動的で高次のオブジェクト指向プログラミング言語を使用して同様の問題に対処したときに、よく呼ばれるように表示されます。一部のパターンは表示されなくなります。つまり、それらは言語機能によって直接サポートされ、一部のパターンはより単純であるか、別の焦点を持ち、一部は本質的に変更されていません。


1
問題はPythonに関するものでした。この論文は、Schemeのような言語について語っています。つまり、私が言えることから、この特定の論文の現場で発明されました。質問者が(a)Pythonの実践に長い経験を持つ(a)学術的コンピューター科学者でない限り、彼らが論文から何か価値のあるものを得ることができるかどうか疑問に思っています。そもそも。:)
Brandon Rhodes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.