Python のクラス変数とインスタンス変数を理解する
Python では、クラス変数とインスタンス変数は、オブジェクトの動作の定義と変更において重要な役割を果たします。ただし、それらの独特の特徴が混乱を招く可能性があります。この記事の目的は、それらの違いを明確にし、リストがクラス変数とインスタンス変数の両方として使用できる理由を説明することです。
クラス変数とインスタンス変数
クラス変数は次の場所で宣言されます。クラス レベルであり、そのクラスのすべてのインスタンスによって共有されます。これらは通常、コンストラクター (__init__()) メソッドの外側で定義されます。一方、インスタンス変数は各インスタンスに固有であり、self 属性を使用してコンストラクター内で定義されます。
例 1: クラス変数
次のコードクラス変数リストとインスタンス変数 self.list を持つクラスを作成します:
<code class="python">class testClass(): list = [] # Class variable def __init__(self): self.list.append('thing') # Instance variable</code>
この例では、testClass.list は testClass のすべてのインスタンスが共有するクラス変数です。コンストラクターが呼び出されると、self.list に「thing」が追加され、インスタンスごとにインスタンス変数が作成されます。その結果、p.list と f.list にアクセスすると、同じクラス変数を共有しているため、どちらも ['thing'] を出力します。
例 2: インスタンス変数
対照的に、list クラス変数を削除してコンストラクター内で再定義すると、
<code class="python">class testClass(): def __init__(self): self.list = [] self.list.append('thing')</code>
testClass の各インスタンスは独自の self.list インスタンス変数を持つようになります。 p.list と f.list を呼び出すと、両方とも ['thing'] を出力しますが、これらはインスタンス間で共有されない別個のリストです。
Python の変数解決
この動作は、Python の変数解決プロセスが原因です。 self.list にアクセスすると、Python はまずインスタンス オブジェクト内の名前リストを確認します。見つからない場合は、クラス定義を検索します。
最初の例では、インスタンスにリスト名が定義されていないため、self.list はクラス変数に解決されます。 2 番目の例では、self.list はコンストラクター内で定義されているため、インスタンス変数に解決されます。
結論
クラス変数とインスタンス変数の違いを理解することが重要ですPython オブジェクトを効果的に操作するためのものです。クラス変数はすべてのインスタンスで共有されますが、インスタンス変数は各オブジェクトに固有です。 Python の変数解決プロセスは、self.variable_name.
を使用するときにどの変数にアクセスするかを決定します。以上が記事の内容に適した質問ベースのタイトルをいくつか示します。 * Python のクラス変数とインスタンス変数: リストが両方として表示されるのはなぜですか? * Python のクラス変数とインスタンス変数を理解する:の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。