Pythonでクラス変数を正しく定義する方法を徹底解説
クラス変数とは何か
Pythonにおけるクラス変数とは、__init__メソッドの外側で宣言される変数のことです。クラス変数は静的な要素として扱われ、クラスから生成される個々のインスタンスではなく、クラスそのものに属します。そのため、クラス変数の値はそのクラスのすべてのインスタンス間で共有されるという特徴があります。
一方、__init__メソッド内で self.変数名 の形式で定義される変数はインスタンス変数と呼ばれ、各オブジェクトごとに独立した値を持ちます。
クラス変数の基本的な定義例
まずは、クラス変数を定義するシンプルなコード例を見てみましょう。
class MyClass:
__item1 = 123
__item2 = "abc"
def __init__(self):
# pass または他の処理
passこの例では、__item1 と __item2 がクラス変数として、メソッドの外(クラス本体直下)で定義されています。
クラス変数とインスタンス変数の動作の違い
より理解を深めるために、クラス変数とインスタンス変数の両方を持つクラスを使って、実際の挙動を確認してみましょう。
class MyClass:
stat_elem = 456 # クラス変数
def __init__(self):
self.object_elem = 789 # インスタンス変数
c1 = MyClass()
c2 = MyClass()
# 両方の要素の初期値を確認
>>> print(c1.stat_elem, c1.object_elem)
456 789
>>> print(c2.stat_elem, c2.object_elem)
456 789
# クラス変数を変更してみる
MyClass.stat_elem = 888
>>> print(c1.stat_elem, c1.object_elem)
888 789
>>> print(c2.stat_elem, c2.object_elem)
888 789
# 次に、インスタンス変数を変更してみる
c1.object_elem = 777
>>> print(c1.stat_elem, c1.object_elem)
888 777
>>> print(c2.stat_elem, c2.object_elem)
888 789実行結果から読み取れるポイント
- クラス変数の変更は全インスタンスに反映される:
MyClass.stat_elem = 888とクラス自体の属性を変更すると、c1とc2のどちらから参照しても値が888になりました。これはクラス変数がすべてのインスタンスで共有されているためです。 - インスタンス変数の変更はそのオブジェクトだけに影響する:
c1.object_elem = 777と変更しても、c1の値だけが777になり、c2は元の789のままです。インスタンス変数は各オブジェクト固有のデータだからです。
まとめ
クラス変数は __init__ メソッドの外で定義し、クラス全体で共有したい値(設定値やカウンターなど)に適しています。一方、オブジェクトごとに異なる状態を保持したい場合は、__init__ 内でインスタンス変数として定義しましょう。この違いを正しく理解することが、Pythonのオブジェクト指向プログラミングをマスターする第一歩となります。
-
Pythonで例外をログに記録する最良の方法とは?
Pythonプログラムの開発や運用において、例外(エラー)が発生した際にその詳細をログとして残しておくことは、トラブルシューティングやデバッグを行う上で非常に重要です。Pythonでは標準ライブラリのloggingモジュールを使うことで、例外情報を簡単かつ確実にログへ記録できます。 logging.exceptionメソッドで例外ログを作成する まずloggingモジュールをインポートし、exceptブロック内でlogging.exception()メソッドを呼び出します。このメソッドは、指定したメッセージに加えて、発生した例外の種類やスタックトレース(Traceback)を自動的に付加して
-
Pythonでカスタム例外を使ってオブジェクトを渡す正しい方法とは?
Pythonでは、組み込みのExceptionクラスを継承することで、独自のカスタム例外を簡単に定義できます。カスタム例外には、エラーメッセージとなる文字列や、その他のオブジェクトを引数として渡すことが可能で、例外発生時の詳細な情報を保持しておけます。 次のコードでは、ExceptionクラスのサブクラスとしてFooExceptionというカスタム例外を作成し、文字列オブジェクトを渡しています。 コード例 #foobar.py class FooException(Exception): def __init__(self, text, *args): super(Fo