022 Pythonでselfを使ってクラスを定義する

2022/03/29

紹介/オブジェクト指向

t f B! P L

Pythonでオブジェクト指向に沿ってクラスを定義していくと,必ず,
    __init__関数って何?
    selfって何?
という疑問が出てきます.いずれも,Pythonの仕様(スクリプトの書き方のキマリ)なので,慣れてもらうしかないです.
__init__関数に関しては,前の投稿の021 Pythonでクラスのコンストラクタを定義するで,それとなく紹介しました.
今回は,selfに関して説明します.

selfそのものの説明は非常に難しいので,selfの使い方を下記に紹介します(「selfはクラス/インスタンス自身を意味する」と言われても,いよいよ分からないと思います).

  1. クラスのメンバ関数を定義する時に,第一引数にselfを入れる
  2. クラスに属する変数(インスタンス変数)は,self.変数名という形で使う
  3. インスタンス変数は,クラス内で共通の変数である

以下,具体例を上げて説明します.

以前投稿した008 PyVISAの簡単な紹介で,PyVISAパッケージを使って測定機器を特定する関数の紹介をしました.ここでは,その測定機器を特定する関数を,FuncGenクラスメンバ関数open_instrumentとして定義します.
    class FuncGen:
        def open_instrument(self):
            rm = pyvisa.ResourceManager()
            self.inst = rm.open_resource(self.visaresource)

上記のFuncGenクラスのopen_instrumentメンバ関数は,下記のように呼び出します.
    funcgen = FuncGen()
    funcgen.open_instrument()

まず,open_instrumentメンバ関数の第一引数に,selfを入れます.
しかし,そのopen_instrumentメンバ関数を呼び出す際には,self引数に該当する引数が無い(引数0)ことに注意して下さい.つまり,self引数は,定義する関数がメンバ関数であることを示すものなのだと考えて下さい(ウソの説明です).

次に,
    
self.inst = rm.open_resource(self.visaresource)
の行ですが,ここで,2つのインスタンス変数があります.self.visaresourceは,__init__コンストラクタで代入されており,クラス内で共通の変数のため,ここで使うことができます.
また,self.instは同じく,他のメンバ関数(例えば,電圧を設定するset_voltメンバ関数など)で,共通の変数として使うことができます.

インスタンス変数は,クラス内で共通の変数のため,メンバ関数の引数に入れる必要はありません.上手く使うことで,複数のメンバ関数の定義が簡略化され,非常に見やすくなります.
(実は,ここでの「クラス内で共通」という表現は正しくありませんが,クラスメンバ関数の定義という観点から,敢えてそういう表現を取りました.気になる方は,クラス変数インスタンス変数違いについて,調べてみて下さい)




このブログを検索

自己紹介

C++やC#を使って数値解析プログラムの開発を長年行ってきました.
今は,Pythonを使った自動処理システムの開発をメインに行っています.

QooQ