Python
 Computer >> コンピューター >  >> プログラミング >> Python

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__メソッド: インスタンスごとの初期化処理を行う場所です。新しいオブジェクトが生成されるたびに必ず実行されます。

このように、クラス内のどこにコードを書くかは単なる記述位置の問題ではなく、いつ・どのタイミングで実行されるかを意識することが重要です。

  1. Pythonの文字クラス操作とは?正規表現での積集合・差集合・和集合を解説

    文字クラス操作とは 一部の正規表現エンジンでは、文字クラスの中で高度な演算を行うことができます。これにより、単純な文字の並びや範囲指定にとどまらず、より柔軟なパターンマッチングが可能になります。主な操作は以下の3つです。 差集合(減算):あるクラスには属するが、別のクラスには属さない文字にマッチさせる 積集合(交差):複数のクラスのどちらにも属する文字にマッチさせる 和集合(結合):複数のクラスのいずれかに属する文字にマッチさせる 積集合(AND演算) AND演算子 && を使うと、複数のクラスの積集合を指定できます。[…&&[…]] という形式で記述し、

  2. Pythonでタプルが不変(イミュータブル)である理由とは?

    Pythonのタプルが不変(イミュータブル)である理由は、主に以下の5つのポイントにあります。 1. 順序の維持 タプルは、Pythonにおいて「順序」を表現するためのデータ構造として設計されています。例えば、データベースからタプルのリスト形式でデータを取得する場合、各タプルは取得したフィールドの順序どおりに並んでいます。不変であることで、この順序が意図せず書き換えられる心配がありません。 2. コピー効率 不変オブジェクトの場合、実体を丸ごとコピーする代わりに、エイリアス(同じオブジェクトへの参照の別名)を作成するだけで済みます。変数を参照として束縛するだけでよいため、メモリ消費と処理時