【Pythonでselfを書く理由とは】初心者がつまずくクラスとメソッドの疑問をすっきり解決

【作業自動化】Python
スポンサーリンク

  • 「Pythonの学習を進めて、やっと『クラス』に入ったぞ!……と思ったら、メソッドのカッコの中に毎回出てくるselfって何者?書かないとエラーになるし、意味がわからない…!」
  • 「なんで毎回『self』って自分を引数に呼ばなあかんねん!」

そんなふうにパソコン画面にツッコミを入れたりしたことはありませんか?

この記事では、selfが持つ本質的な役割と、Pythonが明示的な記述を求める設計思想について論理的に解説します。

仕組みを理解することで、クラス構造に対する苦手意識を解消し、読みやすく堅牢なプログラムを作成できるようになります。

【作業自動化】Pythonの記事を見る 

selfの役割は操作対象となる実体の特定

クラスとインスタンスの関係性を整理する際、よく用いられるのが設計図と実体の対比になります。

たとえば、たい焼きの型をクラス(設計図)、実際に焼き上がったたい焼きをインスタンス(実体)と捉えてみます。

クラスには中身の具材をセットしたり、情報を表示したりする処理(メソッド)が定義されています。
もし複数のたい焼き(たとえば粒あん入りとカスタード入り)が存在する場合に「チーズを追加して」とプログラムに指示を出しても、どちらのたい焼きに追加するのか、対象を区別する必要がありますよね。

そこで用いられるのがselfです。メソッドの内部でself.nakami = “チーズ”のように記述することで、現在処理を行っている特定のインスタンスを示し、他のデータと混同することなく安全に値を保持・変更できるようになるというわけです。

明示的な記述を重視するPythonの設計思想

Javaなどプログラミング言語の中には、自身を指す参照(thisなど)を省略しても自動的に補完する仕様を持つものも存在します。それにもかかわらず、Pythonがメソッド定義時に毎回selfの記述を必須としている理由は、Pythonの設計指針として暗黙的なものより明示的なもののほうが優れているという原則があるからだと考えられます。

裏側で自動処理が行われる仕様は記述の手間を省ける反面、コードを後から読み返した際に、その変数がローカル変数なのか、それともインスタンス自身が保持する属性なのかが判別しにくくなります。

第一引数にselfを明示させるルールを統一することで、誰が読んでもデータの所在が一目で把握できるようになっています。
そのため、複数人での開発や過去のコード改修時にも、バグの混入を防ぐ大きな助けとなります。

コード例による動作確認と引数の仕組み

実際のコードを通じて、selfがどのように機能しているかを確認してみましょう。以下のコードをコピーして実行環境でお試しいただけます。

# たい焼きの型(クラス)を定義します
class Taiyaki:

    # 第一引数としてselfを受け取ります
    def __init__(self, nakami):

        # 生成されたインスタンスの属性として具材を保持します
        self.nakami = nakami

    # 中身の情報を出力するメソッド
    def show_info(self):
        # selfを通じて自身が保持するデータを参照します
        print(f"このたい焼きの中身は{self.nakami}です。")

# 2つの独立したインスタンスを生成します
anko_taiyaki = Taiyaki("つぶあん")
cream_taiyaki = Taiyaki("カスタード")

# それぞれのインスタンスからメソッドを実行します
anko_taiyaki.show_info()
cream_taiyaki.show_info()
実行結果:
このたい焼きの中身はつぶあんです。
このたい焼きの中身はカスタードです。

コードを実行すると、それぞれのインスタンスが保持するデータが混ざることなく正確に出力されます。

ここで注目していただきたい点は、メソッドを呼び出す側ではanko_taiyaki.show_info()のように記述し、引数にselfを指定していない点です。

Pythonの内部仕様により、ドット記法(インスタンス名.メソッド名())で呼び出された際、ドットの左側にあるインスタンス自身が第一引数として自動的に渡される仕組みになっています。

そのため、定義側では第一引数に受け皿としてselfを用意し、呼び出し側では意識せずに引数を省略して呼び出す形となります。

クラスを活用して保守性の高いコードを書くポイント

selfの仕組みを理解することで、単に関数や変数を並べるだけでなく、データとその操作を一体化させたクラス設計が可能になります。

業務効率化やデータ集計ツールを作成する際にも、対象ごとに独立した状態を安全に管理できるため、予期せぬ上書きエラーを防ぐことができます。

基本構文を押さえた上で、日常の業務自動化にもぜひクラス構造を取り入れてみてください!

【作業自動化】Pythonの記事を見る 


Pythonの本は種類が多すぎて、業務効率化に使えるのか見分けるのが大変ですよね。実務自動化に5年以上携わってきた私が、「デスクワークの自動化に即戦力になった本」を厳選して紹介します。失敗しない1冊を見つけたい方は、ぜひ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でしたが、年間100万円以上節約していました。
株式投資で年間360万円以上投資し、iDeCoも併用しています。
総資産はアッパーマス層に到達しました。
資格は日商簿記3級を持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、生産性を高めるITスキルについて発信しています。

生活を豊かにするため、高配当株投資で年間配当金60万円をめざしています。
現在の年間配当金は30万円ほどです。

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【作業自動化】PythonITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました