目次
結論メモ
「__関数名__」は特殊メソッドと呼ばれる予め用意されている関数。オーバーライドして良く使う。
それ以外は、あまり気にしなくて良い。特殊な効果がある場合もあるが、大体慣例として使っているだけで、アンダースコアにこだわる必要が無いと個人的に思う。
リターン値を無視する意思表示としての慣例
#複数値のリターンがある関数
def func():
return 'test',1
#xにtest、yに1が返却されている。
#例.x,y=func()
#yの返却値は必要ないので、_で使わない意思表示。ただの慣例
x,_=func()
#xを出力するだけなので、yは使わない。
print(x)
#_を出力すると1と表示される。つまり、ただの変数と認識されているっぽい。
print(_)
特に使わない値を受け取る変数名の慣例として、アンダースコアが使われる。アンダースコアである必要は無い。
「不要な値をアンダースコアで受け取ることで、メモリに割り当てず破棄できる」みたいな紹介をしているサイトを見かけるが、特にそんなことは無いと思う。
試しに_を出力してみると、_に渡された破棄されていると思っていた値が表示された。
関数、変数名の前後につける
_名称(例.def _func:)
別クラスの関数を利用する際に、「from クラス名 import*」で使えるようになるが、このアンダースコアを1つ頭に付けている関数は利用できない。
ただし、クラス名.関数名で利用することはできる。
名称_(例.class_ = “class名”)
予約語と同じ名前は使えないので、似たような名前にするための区別として、慣例的に使われる。アンダースコアである必要は無い。
__名称(例.self.__test)
マングリングの適用らしい。クラス外から参照できなくなるらしいが、試してみたら普通に呼べる。良く分からない。
サブクラスと同名の定義をしたい場合、衝突を避けて、自身のクラスの変数を利用したい時に使えるらしい。
__名称__(例.__init__)
特殊メソッドと呼ばれる、既に用意されている関数のこと。
適切にオーバーライドすることで、様々な処理が可能になる。__exit__とか__del__など色々ある。
自分で新しく定義するのは止めた方が良いとのこと。