Pythonのクラス変数(静的変数)とは?定義方法とアクセス方法を徹底解説
Pythonでは、クラス内のメソッドの外側で宣言された変数を「クラス変数」または「静的変数」と呼びます。クラス変数はクラス自体に属し、すべてのインスタンス間で共有される点が大きな特徴です。
クラス変数はクラス名を通じて参照するのが基本ですが、インスタンス経由でも読み取ることができます。ただし、インスタンス経由で代入を行うと、そのインスタンス固有の属性が新しく作られるため注意が必要です。
例1:クラス変数を使ったカウント管理
以下は、クラス変数とインスタンス変数の違いを示すサンプルプログラムです。
class Fruits(object):
count = 0
def __init__(self, name, count):
self.name = name
self.count = count
Fruits.count = Fruits.count + count
def main():
apples = Fruits("apples", 3)
pears = Fruits("pears", 4)
print(apples.count)
print(pears.count)
print(Fruits.count)
print(apples.__class__.count) # Fruits.count と同じ
print(type(pears).count) # これも同じ
if __name__ == '__main__':
main()実行結果
3 4 7 7 7
この例では、self.countが各インスタンス固有の値(リンゴなら3、ナシなら4)を保持している一方、Fruits.countはクラス変数として全インスタンスの合計である「7」を保持しています。apples.__class__.countやtype(pears).countのように、インスタンスからクラスオブジェクトを経由してアクセスしても同じ値が得られます。
例2:クラスレベルで定義した変数へのアクセス
次に、クラスレベルで定義された変数へアクセスした場合の動作を見てみましょう。
class example:
staticVariable = 9 # クラス経由でアクセス可能
print(example.staticVariable) # 9 を出力
# インスタンス経由でアクセス
instance = example()
print(instance.staticVariable) # これも 9 を出力
# インスタンス側で値を変更
instance.staticVariable = 12
print(instance.staticVariable) # 12 を出力
print(example.staticVariable) # 9 のまま変わらない実行結果
9 9 12 9
このように、インスタンス経由でinstance.staticVariable = 12と代入すると、クラス変数が書き換わるのではなく、そのインスタンスに同名の新しい属性が作成されます。そのため、インスタンス経由の参照では12が返る一方、クラス変数example.staticVariableは元の9のまま維持されます。
まとめ
- メソッドの外で宣言された変数はクラス変数(静的変数)として扱われる
- クラス変数はすべてのインスタンスで共有され、クラス名から参照するのが基本
- インスタンス経由での代入はクラス変数を変更せず、インスタンス属性が新規作成される
- クラス変数と同名のインスタンス変数は互いに独立しており衝突しない
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(
-
Pythonでクラス変数を正しく定義する方法を徹底解説
クラス変数とは何かPythonにおけるクラス変数とは、__init__メソッドの外側で宣言される変数のことです。クラス変数は静的な要素として扱われ、クラスから生成される個々のインスタンスではなく、クラスそのものに属します。そのため、クラス変数の値はそのクラスのすべてのインスタンス間で共有されるという特徴があります。一方、__init__メソッド内で self.変数名 の形式で定義される変数はインスタンス変数と呼ばれ、各オブジェクトごとに独立した値を持ちます。クラス変数の基本的な定義例まずは、クラス変数を定義するシンプルなコード例を見てみましょう。class MyClass: __ite