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つは衝突防止
このくらいで理解しておくと良いのかなと思います。
勉強中だと特に「なんでこうなってるの?」と引っかかりやすい部分ですが、一度整理してしまえば怖くないです。


コメント