Pythonのクラス内宣言と__init__メソッド内の宣言は同じではない!実行タイミングの違いを解説
Pythonでは、クラス本体(__init__メソッド以外の場所)に書かれた宣言やコードと、__init__メソッド内に書かれたコードは同等ではありません。両者は実行されるタイミングが根本的に異なり、以下のサンプルコードでその違いを実際に確認できます。
クラス定義時とインスタンス生成時の違い
クラス本体に直接書かれた文は、クラスが定義された時点(モジュール読み込み時)に一度だけ実行されます。一方、__init__メソッド内のコードは、インスタンスが生成されるたびに実行されます。この実行タイミングの差が、両者の最大の違いです。
サンプルコード
import sys
class foo():
print('within class')
def __init__(self):
print('within init')
def do_smthng(self):
print('do something')
def main():
f = foo()
f.do_smthng()
return 0
if __name__ == '__main__':
sys.exit(main())
実行結果
within class within init do something
実行結果の解説
出力順序に注目してください。最初に表示されているのは「within class」です。これは、fooクラスが定義された時点で、クラス本体に書かれたprint文がすでに実行されていたことを示しています。
その後、main()関数内でf = foo()によりインスタンスが生成されると、__init__メソッドが呼び出され「within init」が出力されます。最後にdo_smthng()メソッドを明示的に呼び出すことで「do something」が表示されます。
使い分けのポイント
この動作の違いから、次のような使い分けが推奨されます。
- クラス本体: クラス変数の定義など、全インスタンスで共有する値の宣言に適しています。クラス定義時に一度だけ評価されます。
__init__メソッド: インスタンスごとの初期化処理を行う場所です。新しいオブジェクトが生成されるたびに必ず実行されます。
このように、クラス内のどこにコードを書くかは単なる記述位置の問題ではなく、いつ・どのタイミングで実行されるかを意識することが重要です。
-
Pythonの文字クラス操作とは?正規表現での積集合・差集合・和集合を解説
文字クラス操作とは 一部の正規表現エンジンでは、文字クラスの中で高度な演算を行うことができます。これにより、単純な文字の並びや範囲指定にとどまらず、より柔軟なパターンマッチングが可能になります。主な操作は以下の3つです。 差集合(減算):あるクラスには属するが、別のクラスには属さない文字にマッチさせる 積集合(交差):複数のクラスのどちらにも属する文字にマッチさせる 和集合(結合):複数のクラスのいずれかに属する文字にマッチさせる 積集合(AND演算) AND演算子 && を使うと、複数のクラスの積集合を指定できます。[…&&[…]] という形式で記述し、
-
Pythonでタプルが不変(イミュータブル)である理由とは?
Pythonのタプルが不変(イミュータブル)である理由は、主に以下の5つのポイントにあります。 1. 順序の維持 タプルは、Pythonにおいて「順序」を表現するためのデータ構造として設計されています。例えば、データベースからタプルのリスト形式でデータを取得する場合、各タプルは取得したフィールドの順序どおりに並んでいます。不変であることで、この順序が意図せず書き換えられる心配がありません。 2. コピー効率 不変オブジェクトの場合、実体を丸ごとコピーする代わりに、エイリアス(同じオブジェクトへの参照の別名)を作成するだけで済みます。変数を参照として束縛するだけでよいため、メモリ消費と処理時