Python変数名の先頭に付ける単一アンダースコア(_)の意味とは?
単一アンダースコア(_)の意味
Pythonでは、クラス内で定義する属性名やメソッド名の先頭にアンダースコアを1つ付けると、「これは外部から直接使うことを想定していない内部向けの機能である」という意図を他の開発者に伝える慣習的な合図になります。あくまで開発者間の紳士協定であり、言語仕様としてアクセスが禁止されるわけではない点に注意しましょう。
一般的には、半ばプライベートな(semi-private)変数には単一アンダースコア、完全にプライベートな変数には二重アンダースコアを使うことが推奨されています。
PEP 8(Python公式スタイルガイド)には、次のように記載されています。
_single_leading_underscore:弱い「内部利用」を示す目安。たとえば from M import * を実行しても、アンダースコアで始まる名前のオブジェクトはインポートされない。
コード例
以下のコードは、単一アンダースコアと二重アンダースコアの挙動の違いを示したものです。
class MyClass():
def __init__(self):
self.__fullprivate = "World"
self._semiprivate = "Hello"
mc = MyClass()
print(mc._semiprivate) # 問題なくアクセス可能
print(mc.__fullprivate) # アクセスするとエラーになる実行結果
Hello
Traceback (most recent call last):
File "example.py", line 8, in <module>
print(mc.__fullprivate)
AttributeError: 'MyClass' object has no attribute '__fullprivate'このように、単一アンダースコア付きの _semiprivate は外部からでも問題なく参照できる一方、二重アンダースコア付きの __fullprivate にアクセスしようとすると AttributeError が発生します。
補足:ネームマングリングの仕組み
二重アンダースコアで始まる属性は、Pythonの「ネームマングリング(name mangling)」と呼ばれる仕組みにより、内部的に _ClassName__属性名 の形式へ自動的に書き換えられます。そのため mc.__fullprivate という記述では直接アクセスできず、結果として擬似的なプライベート化が実現しているのです。
ただし、これも完全な隠蔽ではありません。mc._MyClass__fullprivate のように明示的に記述すれば、アクセスすること自体は可能です。
まとめ
単一アンダースコアは「内部向けであることの合図」、二重アンダースコアは「ネームマングリングによる擬似プライベート化」という使い分けが基本です。チーム開発では、外部公開する必要のない属性やメソッドにアンダースコアを付けることで、コードの意図を明確に伝えられます。
-
Python Pandas・Seabornのswarmplotで2つのカテゴリ変数を使ってデータをグループ化する方法
Seabornのスウォームプロット(Swarm Plot)は、点が重ならないように配置されたカテゴリ別散布図を描画するための機能です。この描画には seaborn.swarmplot() を使用します。スウォームを2つのカテゴリ変数でグループ化したい場合は、swarmplot() の x、y、または hue パラメータにそれらの変数を指定します。 ここでは、CSVファイル「Cricketers2.csv」に保存されたデータセットを例に説明します。 必要なライブラリのインポート まず、必要なライブラリをインポートします。 import seaborn as sb import pandas as
-
Pythonのグローバルインタプリタロック(GIL)とは?仕組みと課題をわかりやすく解説
本記事では、Pythonのグローバルインタプリタロック(GIL:Global Interpreter Lock)について詳しく解説します。GILとは、複数のスレッドが同時にPythonインタプリタのコードを実行できないよう制御する排他制御機構(ロック)のことです。この仕組みにより、マルチスレッド環境であっても、実際には一度に1つのスレッドしかPythonバイトコードを実行できません。そのため、GILはPython 3.x以前における設計上の課題として認識されることが多く、真の意味でのマルチスレッド処理を妨げる要因となっています。GILが導入された理由Pythonは自動ガベージコレクション(GC