Pythonのクラス属性とインスタンス属性の違いを徹底解説
クラス属性とインスタンス属性とは
Pythonにおけるクラスは、オブジェクトを生成するための設計図(ブループリント)のようなものです。クラスから生成されたオブジェクト(インスタンス)は、それぞれ独自の属性を持つことができ、一度生成されればクラス側の属性に依存しなくなります。また、クラスは生成済みインスタンスの属性を直接制御することもできません。
この関係を理解することは、Pythonのオブジェクト指向プログラミングをマスターする上で非常に重要です。以下では、具体的なコード例を通じて、クラス属性とインスタンス属性がどのように動作するのかを見ていきましょう。
コード例
次の例では、MainClassがクラス属性 class_attr を持ち、そこから生成された各オブジェクトがそれぞれ固有のインスタンス属性値を持っています。
class MainClass(object):
class_attr = 'Sun'
def __init__(self, instance_attr):
self.instance_attr = instance_attr
if __name__ == '__main__':
obj1 = MainClass('Mon')
obj2 = MainClass('Tue')
# インスタンス属性を出力
print(obj1.instance_attr)
print(obj2.instance_attr)
# クラス名を使ってクラス属性を出力
print(MainClass.class_attr)
# オブジェクト経由でクラス属性を出力
print(obj1.class_attr)
print(obj2.class_attr)
# インスタンス属性をクラスのプロパティとして参照するとエラーになる
# print(MainClass.instance_attr)実行結果
上記のコードを実行すると、以下の出力が得られます。
Mon Tue Sun Sun Sun
結果の解説
出力結果から、以下の重要なポイントが読み取れます。
- obj1.instance_attr と obj2.instance_attr は、それぞれ「Mon」「Tue」という異なる値を返します。これは、各インスタンスが独立した属性を持っているためです。
- MainClass.class_attr は「Sun」を返します。クラス属性はすべてのインスタンス間で共有される単一の値です。
- obj1.class_attr や obj2.class_attr も「Sun」を返します。インスタンス経由でもクラス属性にはアクセスできます。
一方、最後のコメントアウトされた行のように、MainClass.instance_attr とクラス名から直接インスタンス属性を参照しようとすると、AttributeError が発生します。これは、インスタンス属性が個々のオブジェクトに紐づいており、クラス自体には存在しないためです。
まとめ
クラス属性は全インスタンスで共有される値であり、クラス名またはインスタンスのどちらからでもアクセス可能です。一方、インスタンス属性は各オブジェクトごとに独立して保持され、そのオブジェクト自身からしかアクセスできません。この違いを正しく理解しておくことで、意図しないバグを防ぎ、より堅牢なPythonプログラムを書くことができます。
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(
-
Pythonでクラスの属性を定義・確認する方法をわかりやすく解説
クラスの属性とはPythonでは、ほぼすべてのものがオブジェクトとして扱われます。そして、すべてのオブジェクトには属性(アトリビュート)とメソッドが備わっています。つまり、属性はPythonプログラミングにおいて非常に基礎的かつ重要な概念なのです。クラスとは、類似したオブジェクトをまとめて扱うための仕組みであり、クラス自体にも属性を持ちます。ここで注意したいのが、クラス属性とインスタンス属性の違いです。クラス属性は、そのクラスから生成されたすべてのインスタンス間で共有されます。しかし、その逆(インスタンス属性が他のインスタンスやクラスに共有される)は成り立ちません。dir関数でオブジェクトの属