さらにマイクをエコーし、アレックスのアドバイスを、自分の色を追加します...
インスタンス属性の使用は典型的です...より慣用的なPythonです。クラス属性は、ユースケースが特定であるため、あまり使用されていません。静的メソッドとクラスメソッドと「通常の」メソッドについても同じことが言えます。これらは特定のユースケースに対処する特別な構成要素です。それ以外の場合は、Pythonプログラミングのあいまいなコーナーを知っていることを見せびらかしたい異常なプログラマーによって作成されたコードです。
Alexは返答の中で、検索のレベルが1つ少ないため、アクセスが(少し)速くなると述べています。これは変数アクセスと非常に似ています-検索順序は次のとおりです。
- 地元の人
- 非ローカル
- グローバル
- ビルトイン
属性アクセスの場合、順序は次のとおりです。
- インスタンス
- クラス
- MRO(メソッド解決順序)によって決定される基本クラス
どちらの手法も「裏返し」の方法で機能します。つまり、最もローカルなオブジェクトが最初にチェックされ、次に外側のレイヤーが続けてチェックされます。
上記の例では、path
属性を検索しているとしましょう。「self.path
」のような参照に遭遇すると、Pythonは一致するインスタンス属性を最初に調べます。それが失敗すると、オブジェクトのインスタンス化元のクラスをチェックします。最後に、基本クラスを検索します。Alexが述べたように、インスタンスに属性が見つかった場合、他の場所を探す必要がないため、時間を少し節約できます。
ただし、クラス属性を主張する場合は、追加のルックアップが必要です。それとも、あなたの他の代替は、例えば、クラスの代わりに、インスタンスを介してオブジェクトを参照することでMyController.path
はなく、self.path
。これは遅延ルックアップを回避する直接ルックアップですが、アレックスが後述するように、それはグローバル変数であるため、([グローバル]クラス名へのローカル参照を作成しない限り)保存するつもりであったと思っていたビットを失います)。
つまり、ほとんどの場合、インスタンス属性を使用する必要があります。ただし、クラス属性がジョブに適したツールである場合があります。両方を同時に使用するコードではself
、インスタンス属性オブジェクトと同じ名前のクラス属性へのシャドウアクセスのみが得られるため、最も注意が必要です。この場合、属性を参照するには、クラス名で属性にアクセスする必要があります。