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