logo

Python のクラス変数または静的変数

すべてのオブジェクトはクラス変数または静的変数を共有します。インスタンスまたは非静的変数はオブジェクトごとに異なります (すべてのオブジェクトにコピーがあります)。たとえば、コンピュータ サイエンスの学生をクラスで表すとします。 CS学生 。クラスには、すべてのオブジェクトの値が cse である静的変数が含まれる場合があります。また、クラスには次のような非静的メンバーが含まれる場合もあります。 名前 そして ロール

C++ と Java では、静的キーワードを使用して変数をクラス変数にすることができます。先行する static キーワードのない変数はインスタンス変数です。 Java の例についてはこれを、C++ の例についてはこれを参照してください。



説明:

Python では、静的変数は、各インスタンスに固有ではなく、クラスのすべてのインスタンス間で共有される変数です。これは、クラスの特定のインスタンスではなくクラス自体に属するため、クラス変数と呼ばれることもあります。

静的変数はクラス定義の内部で定義されますが、メソッド定義の外部で定義されます。これらは通常、インスタンス変数と同様に値で初期化されますが、インスタンスを通じてではなくクラス自体を通じてアクセスおよび変更できます。

静的変数の特徴

  • 静的変数には、クラスのオブジェクトが初めて作成されるときに一度メモリが割り当てられます。
  • 静的変数はメソッドの外でクラス内に作成されます
  • 静的変数にはクラスを通じてアクセスできますが、インスタンスから直接アクセスすることはできません。
  • 静的変数の動作はオブジェクトごとに変わるわけではありません。

Python のアプローチはシンプルです。静的キーワードは必要ありません。



注記: 値が割り当てられているすべての変数クラス宣言はクラス変数です。そして変数 それ メソッド内で割り当てられる値はインスタンス変数です。

Javaのタイプ

例:

パイソン






# Python program to show that the variables with a value> # assigned in class declaration, are class variables> # Class for Computer Science Student> class> CSStudent:> >stream>=> 'cse'> # Class Variable> >def> __init__(>self>,name,roll):> >self>.name>=> name># Instance Variable> >self>.roll>=> roll># Instance Variable> # Objects of CSStudent class> a>=> CSStudent(>'Geek'>,>1>)> b>=> CSStudent(>'Nerd'>,>2>)> print>(a.stream)># prints 'cse'> print>(b.stream)># prints 'cse'> print>(a.name)># prints 'Geek'> print>(b.name)># prints 'Nerd'> print>(a.roll)># prints '1'> print>(b.roll)># prints '2'> # Class variables can be accessed using class> # name also> print>(CSStudent.stream)># prints 'cse'> # Now if we change the stream for just a it won't be changed for b> a.stream>=> 'ece'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'cse'> # To change the stream for all instances of the class we can change it> # directly from the class> CSStudent.stream>=> 'mech'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'mech'>

>

>

出力

cse cse Geek Nerd 1 2 cse ece cse ece mech>

出力:

cse cse Geek Nerd 1 2 cse ece cse ece mech>

例:

パイソン




class> MyClass:> >static_var>=> 0> >def> __init__(>self>):> >MyClass.static_var>+>=> 1> >self>.instance_var>=> MyClass.static_var> obj1>=> MyClass()> print>(obj1.instance_var)># Output: 1> obj2>=> MyClass()> print>(obj2.instance_var)># Output: 2> print>(MyClass.static_var)># Output: 2>

>

>

出力

1 2 2>

説明:

この例では、0 に初期化された静的変数 static_var を持つクラス MyClass を定義します。また、クラスの各インスタンスに固有のインスタンス変数 instance_var も定義します。

クラスのインスタンス (obj1) を作成するとき、静的変数の値を 1 ずつインクリメントし、それをインスタンス変数に割り当てます。クラスの別のインスタンス (obj2) を作成するときに、静的変数を再度インクリメントし、そのインスタンスのインスタンス変数に新しい値を割り当てます。

最後に、クラスのインスタンスではなくクラス自体を使用して静的変数の値を出力します。ご覧のとおり、静的変数の値はクラスのすべてのインスタンス間で共有され、新しいインスタンスが作成されるたびに値が増加します。

静的変数は、クラスのすべてのインスタンス間で状態を維持したり、クラスのすべてのインスタンス間でデータを共有したりするのに役立ちます。ただし、特にマルチスレッド環境では、これらを慎重に使用し、その値がプログラムの状態と同期していることを確認することが重要です。

利点:

    メモリ効率 : 静的変数はクラスのすべてのインスタンス間で共有されるため、同じデータの複数のコピーを作成する必要がなくなり、メモリを節約できます。共有状態: 静的変数は、クラスのすべてのインスタンス間で共有状態を維持する方法を提供し、すべてのインスタンスが同じデータにアクセスして変更できるようにします。アクセスが簡単: クラスのインスタンスを必要とせずに、クラス名自体を使用して静的変数にアクセスできます。これにより、静的変数に格納されたデータへのアクセスと変更がより簡単になります。初期化 : クラスの定義時に静的変数を初期化できるため、変数に有効な開始値があることを簡単に確認できます。可読性 : 静的変数は、変数に格納されているデータがクラスのすべてのインスタンス間で共有されていることを明確に示すため、コードの可読性を向上させることができます。

短所:

    柔軟性のなさ: 静的変数の値はクラスのすべてのインスタンス間で共有されるため、インスタンスごとに異なる値を持つことが困難になるため、柔軟性に欠ける可能性があります。隠れた依存関係 : 静的変数により、コードの異なる部分間に隠れた依存関係が作成される可能性があり、コードの理解と変更が困難になります。スレッド セーフ : 静的変数は、適切に同期されていないと競合状態や同期の問題を引き起こす可能性があるため、マルチスレッド環境では問題となる可能性があります。名前空間汚染 : 静的変数がクラスの名前空間に追加される可能性があり、名前の競合が発生し、コードの保守が困難になる可能性があります。テスト: 静的変数の状態はクラスとそのメソッドの動作に影響を与える可能性があるため、静的変数を使用すると、効果的な単体テストを作成することがより困難になる可能性があります。

全体として、静的変数は Python プログラミングでは便利なツールですが、柔軟性のなさ、隠れた依存関係、スレッドの安全性の問題など、潜在的な欠点に注意して使用する必要があります。