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__
これは渡された引数を使って、クラス定義で新しく作られたオブジェクトを初期化するものです。
最後に
慣れれば良いのでしょうが、未だにこのアンダーバーのパターンはなんだったっけ。ってなるときがあります。
本記事はそんな自分へのメモですが、どなたかの参考になれば幸いです。
Discussion