オブジェクト指向プログラミング¶Pythonは、オブジェクト指向プログラミング言語として記述されることがあります。これはやや誤解を招く可能性があり、明確にする必要があります。Pythonでは、すべてがオブジェクトであり、そのように扱うことができます。これは、たとえば、関数がファーストクラスのオブジェクトであると言うときに意味するものです。関数、クラス、文字列、さらには型はPythonのオブジェクトです。どんなオブジェクトと同様、型を持ち、関数の引数として渡すことができ、メソッドとプロパティを持つことができます。この理解では、Pythonはオブジェクト指向言語です。Javaとは異なり、Pythonはオブジェクト指向プログラミングを主なプログラミングパラダイムとして課していません。Pythonプロジェクトがオブジェクト指向ではないこと、すなわち、クラス定義、クラス継承、またはオブジェクト指向プログラミングに特有の他のメカニズムを使用しないこと、またはごくわずかしか使用しないことは、完全に実行可能です。セクションに見られるように、Pythonがモジュールと名前空間を扱う方法は、開発者に抽象レイヤのカプセル化と分離を保証する自然な方法です。どちらもオブジェクト指向を使用する最も一般的な理由です。したがって、Pythonプログラマーは、ビジネスモデルで必要とされないときに、オブジェクト指向を使用しないという自由度があります。不要なオブジェクト指向を避ける理由はいくつかあります。カスタムクラスを定義することは、いくつかの状態といくつかの機能を結合する場合に便利です。いくつかのアーキテクチャ、通常はWebアプリケーションでは、複数のインスタンスのPythonプロセスが生成され、同時に発生する可能性のある外部要求に応答します。この場合、いくつかの状態をインスタンス化されたオブジェクトに保持することは、世界に関するいくつかの静的情報を保持することを意味し、並行性の問題または競合状態になりがちです。メソッドで行われます)とそのメソッドの1つによるオブジェクト状態の実際の使用の間に、世界が変更された可能性があります。要求はメモリ内のアイテムをロードし、ユーザによってそれを読み取りとしてマークすることができる。別のリクエストで同時にこのアイテムの削除が必要な場合は、最初のプロセスがアイテムをロードした後に実際に削除が行われ、削除されたオブジェクトを読み取り済みとしてマークする必要があります。これと他の問題は、ステートレス関数の使用がより良いプログラミングパラダイムであるという考えにつながりました。同じことを言うもう一つの方法は、できるだけ暗黙的なコンテキストと副作用の少ない関数とプロシージャを使用することを提案することです。関数の暗黙のコンテキストは、関数内からアクセスされる永続化層のグローバル変数または項目のいずれかで構成されます。副作用とは、関数がその暗黙のコンテキストに対して行う変更です。関数がグローバル変数または永続化層にデータを保存または削除する場合、それは副作用を伴うと言われています。文脈や副作用を伴う関数をロジックを持つ関数(純関数と呼ぶ)から慎重に分離することで、次のような利点が得られます。固定された入力が与えられると、出力は常に同じになります。リファクタリングや最適化が必要な場合は、純関数を簡単に変更または置換することができます。純粋な関数は単体テストでテストする方が簡単です。後で複雑なコンテキストの設定やデータのクリーニングが不要になります。純粋な関数は、操作、飾り付け、渡しが簡単です。要約すると、純粋な関数は、コンテキストや副作用がないため、クラスやオブジェクトよりも効率的なビルディングブロックです。明らかに、オブジェクト指向は、有用であり、多くの場合必要になります。コンピュータのメモリ内で比較的長い寿命を有するグラフィカルデスクトップアプリケーションまたはゲームを開発する場合などです。デコレータ¶Python言語は、’デコレータ’と呼ばれている、シンプルで強力な構文を提供しています。デコレータは、関数またはメソッドをラップする(またはデコレートする)関数またはクラスです。「デコレートされた」機能または方法は、元の「デコレートされていない」機能または方法を置き換えます。‘手動で’行うことができますが、@デコレータの構文を使用する方が明確であり、したがって好ましいものです。decoratedこのメカニズムは、懸念を分離し、関数またはメソッドのコアロジックを「汚染する」外部の関連しないロジックを回避するのに便利です。計算されているときにそれらを再計算する代わりに直接使用することができます。これは明らかに関数ロジックの一部ではありません。コンテキストマネージャ¶コンテキストマネージャは、アクションに余分なコンテキスト情報を提供するPythonオブジェクトです。ブロック内のすべてのコードを完了したときに呼び出し可能なものを実行するという形で呼び出すことができます。メソッドが呼び出されることが保証されます。これにより、開発者の認知負荷が軽減され、コードが読みやすくなります。この機能を実装するには、クラスを使用する方法とジェネレータを使用する方法があります。文で使われる2つの余分なメソッドを持つ普通のPythonオブジェクトです。メソッドが呼び出されます。f.read()これは上のクラスの例とまったく同じように動作しますが、もっと簡潔です。ステートメントに達するまで実行されます。呼び出されるようにします。2つのアプローチが同じように見えるので、PythonのZenに従っていつ使うべきかを決める必要があります。クラスのアプローチは、カプセル化するロジックが相当量ある場合には効果的です。ファンクションのアプローチは、単純なアクションを扱う場合には適しています。動的タイピング¶Pythonは動的に型付けされています。変数には固定型がありません。実際、Pythonでは、変数は他の多くの言語、特に静的型の言語とは大きく異なります。変数は、値が書き込まれるコンピュータのメモリのセグメントではなく、オブジェクトを指す「タグ」または「名前」です。‘文字列’に設定してから関数に設定することができます。Pythonの動的型付けはしばしば弱点とみなされ、実際には複雑で難しいコードにつながる可能性があります。‘a’という名前のものはさまざまなものに設定することができ、開発者や管理者は完全に無関係のオブジェクトに設定されていないことを確認するためにこの名前をコード内で追跡する必要があります。この問題を回避するガイドラインがいくつかあります。異なる変数に同じ変数名を使用しないでください。something短い関数やメソッドを使用すると、無関係な2つのものに対して同じ名前を使用するリスクを軽減できます。異なるタイプのものでも、関連するものであっても、異なる名前を使用する方が良いでしょう。set名前を再利用すると効率は上がりません。割り当ては新しいオブジェクトを作成する必要があります。‘if’ブランチやループを含む他のコード行で分かれている場合、与えられた変数の型が何であるかを確かめることは難しくなります。関数型プログラミングのように、変数を再割り当てすることを決して推奨していないコーディングもあります。キーワードで行います。キーワードを持っておらず、とにかくその哲学に反するでしょう。変数に複数回代入するのを避けることは良い規律かもしれませんし、可変で不変な型の概念を理解するのに役立ちます。変更可能および変更不可能な型¶Pythonには、組み込み型とユーザー定義型の2種類があります。ミュータブルなタイプは、コンテンツのインプレース変更を可能にするタイプです。ようなメソッドの変更があります。辞書についても同じことが言えます。イミュータブルは、内容を変更するためのメソッドを提供しません。変数xに整数6を設定すると、「インクリメント」メソッドはありません。1を計算する場合は、別の整数を作成して名前を付ける必要があります。objectこの動作の違いの1つの結果として、ミュータブルなタイプは「安定」ではないため、辞書キーとして使用することはできません。自然に変更可能なものに対しては適切にミュータブルな型を使用し、性質上固定されているものに対してはイミュータブルなタイプを使用すると、コードの意図を明確にするのに役立ちます。このタプルは、インプレースで変更できないペアであり、辞書のキーとして使用できます。初心者を驚かせることができるPythonの特徴の1つは、文字列が不変であることです。する方がはるかに効率的です。呼び出してループ内にリストを構築するよりも優れていて速いということです。使うことが必ずしも最良ではないということです。方が好ましいでしょう。ほかにあらかじめ決められた数の文字列を連結することもできます。演算子の使用を奨励しています。参考文献¶http://docs.python.org/2/library/http://www.diveintopython.net/toc/index.htmlこの有益なガイドは、初心者と熟練のPython開発者の両方に、Pythonのインストール、設定、および使用に関するベストプラクティスハンドブックを毎日提供するために存在します。アップデートを入手する新しいリリースと今後のプロジェクトに関する最新情報を受け取ります。@kennethreitzありがとう!メーリングリストに参加する.オライリー・ブックこのガイドは現在、有形の本の形で利用可能です。