Pythonのアンダーバーってどういう意味?

Pythonのアンダーバーってどういう意味? プログラミング
Pythonのアンダーバーってどういう意味?

Pythonを触っていると、やたらとアンダーバー(_)が出てきます。

__init__ とか、__name__ とか、__internal__ とか、__main__.py とか。

他の言語だとこんなにアンダーバーがでてこないので、おそらく多く人が最初は違和感を感じ野ではないかと思います。

この記事では、Pythonのアンダーバーの種類と役割を、自分が疑問に思って調べた流れでまとめてみます。

そもそもアンダーバーは何をしているのか?

結論から言うと、アンダーバーは「名前に意味を持たせるための記号」です。

Pythonでは、アンダーバーの付き方によって意味が変わります。

  • 両側に2つずつ付くもの(例:__init__)
  • 先頭に1つ付くもの(例:_value)
  • 先頭に2つ付くもの(例:__value)
  • 特殊なファイル名(例:__init__.py、__main__.py)

それぞれ役割が違います。

① 両側にアンダーバーが付くもの(init など)

まず一番よく見るのがこれです。

class Sample:
    def __init__(self):
        print("initialized")

これは「マジックメソッド」や「特殊メソッド」と呼ばれています。

Python本体があらかじめ決めている特別な名前で、特定のタイミングで自動的に呼ばれます。

代表例としては:

  • init → クラス生成時に実行
  • str → printしたときの表示
  • len → len() が呼ばれたとき
  • add → + 演算子
  • name → モジュールの名前

この両側ダブルアンダーバーは、Pythonが予約している名前です。自分で勝手に作るものではありません。

② 先頭にアンダーバーが1つ(_value)

def _internal():
    pass

これは「内部用ですよ」という合図です。

Pythonが強制しているわけではなく、あくまで慣習です。

ライブラリを見ると、外から使ってほしくない関数や変数に付いていることが多いです。

つまり、

「触れなくはないけど、基本は触らないでね」

という意味合いです。

③ 先頭にアンダーバーが2つ(__value)

これは少しややこしいです。

class A:
    def __init__(self):
        self.__value = 10

この __value は、内部的に

_A__value

という名前に書き換えられます。これを「名前マングリング(name mangling)」といいます。

実際にはこうやってアクセスできます。

a = A()
print(a._A__value)

完全なprivateではありません。

目的は「継承時の名前衝突を防ぐこと」です。

親クラスと子クラスで同じ名前を使っても衝突しないように、自動でクラス名付きの名前に変換してくれる仕組みです。

④ if __name__ == “__main__” は何をしているのか?

これもよく見ます。

if __name__ == "__main__":
    main()

Pythonファイルには自動的に name という変数が入っています。

  • 直接実行したとき → “main
  • importされたとき → ファイル名

つまりこの条件は、

「このファイルが直接実行されたときだけ動かす」

という意味です。

これを書いておくと、モジュールとしてimportしたときに余計な処理が実行されなくなります。

⑤ __init__.py と __main__.py

ファイル名にもアンダーバーが付きます。

__init__.py

これは「このフォルダはパッケージですよ」という印です。

また、importされたときに実行される初期化コードを書いたり、公開APIを整理したりできます。

__main__.py

これはパッケージを

python -m パッケージ名

で実行したときに動くファイルです。

単体スクリプトなら main.py で十分ですが、パッケージとして実行したい場合に使います。

まとめ

Pythonのアンダーバーは、単なる飾りではありません。

  • xxx → Pythonが予約している特殊メソッド
  • _xxx → 内部用という慣習
  • __xxx → 名前マングリング(衝突防止)
  • init.py → パッケージ初期化
  • main.py → パッケージ実行用エントリ

最初は全部「なんか特別そう」に見えますが、意味を分解するとそこまで複雑ではありません。

個人的には、

両側ダブルアンダーはPythonの仕様
先頭1つはマナー
先頭2つは衝突防止

このくらいで理解しておくと良いのかなと思います。

勉強中だと特に「なんでこうなってるの?」と引っかかりやすい部分ですが、一度整理してしまえば怖くないです。

コメント

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