🦔

Pythonで最初に躓いたアンダーバーこれなに

に公開

初めに

最近Pythonをメインに触れているためか、夢に蛇(パイソン)が出てきたケニーです。

タイトルのとおりなのですが、Pythonではよくアンダーバーが出てきます。
最初みたとき、なんだこれは!?と躓きまして、
初見では推測も理解も全くできなかったので調べてみました。

アンダーバーの使い方

【関数名】についているアンダーバーについて以下にてまとめてみました。
他にも使い方があるのかもしれませんが、関数+アンダーバーの組み合わせは本当よく見るので、まずはここから。。

_function(hoge) について

関数の前にアンダーバーが1つ

def _fugaFunction(hoge):
  return something

関数を内部的に定義できます。
※他言語でいう、Private属性みたいなもの。

function_(hoge) について

関数の後にアンダーバーが1つ

def fugaFunction_(hoge):
  return something

これはPython内の重要関数と名付けを被らせない為です。
例:class内で、どうしてもlistという関数や引数を設定したいときは、
  list_ と名付けてPythonのlistと被ることを避けることができます。

__function(hoge) について

関数の前にアンダーバーが2つ

def __fugaFunction(hoge):
  return something

名前のマングリング機構を呼び出します。
例:class Hogeの関数 __fugaFunctionについて、
  Hoge.__fugaFunctionでは関数を呼び出すことができず、
  _Hoge__fugaFunctionという使い方でしか呼び出せなくなります。
  その為、疑似的にPrivate属性の扱い方ができるようになります。

※完全にPrivateということではないですが、誤って呼び出してしまうことがなくなるので、
   疑似的にPrivate属性の扱い方ができるようになる。という意味になります。

__ function__(hoge) について

関数の前後にアンダーバーが2つ

def __fugaFunction__(hoge):
  return something

マジックメソッド(特殊メソッド)になります。
オブジェクトの振る舞いを変更したり、クラスの性質にあった動きをさせたい時に使うものになります。

頻繁に見る形としては、以下の例ではないでしょうか。
__init__
これは渡された引数を使って、クラス定義で新しく作られたオブジェクトを初期化するものです。

最後に

慣れれば良いのでしょうが、未だにこのアンダーバーのパターンはなんだったっけ。ってなるときがあります。
本記事はそんな自分へのメモですが、どなたかの参考になれば幸いです。

GitHubで編集を提案
コラボスタイル Developers

Discussion