Pythonのプライベート変数とは?アンダースコア2つの慣習とネームマングリングを解説
厳密な意味では、Pythonには「プライベート変数」という概念は存在しません。しかし、変数名やメソッド名の先頭にアンダースコアを2つ(__)付けることで、それをプライベートとして扱うのが、多くのPythonコードで広く使われている慣習(コンベンション)です。
この概念を、具体的な例を通して理解していきましょう。
サンプルコード(privateVar1.py)
class myClass:
__privateVar = 27
def __privMeth(self):
print("I'm inside class myClass")
def hello(self):
print("Private Variable value: ", myClass.__privateVar)
foo = myClass()
foo.hello()
foo.__privMethこのプログラムでは、__privMethがプライベートメソッド、__privateVarがプライベート変数に相当します。続いて、実際の実行結果を確認してみましょう。
実行結果
Private Variable value: 27
Traceback (most recent call last):
File "C:/Python/Python361/privateVar1.py", line 12, in <module>
foo.__privMeth
AttributeError: 'myClass' object has no attribute '__privMeth'この出力から、クラス「myClass」の外部からは、プライベートメソッドにもプライベート変数にもアクセスできないことが分かります。その一方で、クラスの内部からはプライベート変数にアクセスできます。hello()メソッドの中では __privateVar を参照でき、「Private Variable value: 27」と正しく表示されています。
押さえておきたいポイント
- クラス内で定義された変数やメソッドは、デフォルトではすべてパブリックとして扱われる。
- データメンバーをプライベートとして宣言した場合、それはクラス内部からのみアクセス可能となり、クラス外部からはアクセスできない。
- 変数やメソッドをプライベート化するこの仕組みは、ネームマングリング(name mangling)と呼ばれる。
ネームマングリングの仕組み
__spam(先頭にアンダースコア2つ以上、末尾のアンダースコアは1つ以下)という形式の識別子は、テキスト上で自動的に _classname__spam という形へ置き換えられます。ここで classname とは、先頭のアンダースコアを取り除いた現在のクラス名のことです。
このマングリング処理は、識別子がクラス定義内に出現している限り、構文上の位置(関数内・メソッド内など)に関係なく適用されます。
なお、ダブルアンダースコアで始まる名前は、単なるアクセス制限のためではなく、サブクラスによる属性の意図しない上書き(オーバーライド)を防ぐことを目的として設計されています。
補足:マングリング後の名前に直接アクセスすることも可能
ネームマングリングはあくまで名前の置き換えであり、完全なアクセス禁止ではありません。例えば foo._myClass__privateVar のように、マングリング後の名前を指定すれば、クラス外部からでも値を取得できます。ただし、これはデバッグなどの特殊な用途にとどめ、通常のコードでは避けるべき作法とされています。
-
【Python】変数名を文字列として取得する方法とその注意点
Pythonにおける変数名の仕組み 実は、Pythonでは「変数名を取得する」という操作は本来想定されていません。なぜなら、Pythonの変数とはオブジェクトへの名前のマッピング(参照)にすぎないからです。 Pythonにおいて正規名(canonical name)を持つのは、モジュール、関数、クラスのみです。さらに、関数やクラスが定義された後、あるいはモジュールがインポートされた後に、その正規名が任意の名前空間で意味を持つ保証はありません。加えて、これらの名前はオブジェクト生成後に変更されることもあるため、必ずしも信頼できるものではない点に注意が必要です。 変数名を文字列として取得する方法
-
【初心者向け】PowerShellの変数の基本:作成・確認・削除・追加の方法をわかりやすく解説
コンピュータサイエンスにおいて、変数とは後で利用するために任意の情報を格納しておくメモリ上の場所のことです。言い換えれば、データを一時的に保存し、必要なときに取り出すための「入れ物」です。シェル環境では、そのデータは単語(文字列)でも数字(整数)でも構いません。 パソコンで意識的に変数を使ったことがない人でも、日常生活の中で変数に近いものを使っているはずです。「あれを取って」「これを見て」といった言葉は、文法上の変数(いわゆる代名詞)と言えます。「これ」「あれ」が何を指すのかは、話し手が頭に思い浮かべているものや指差している対象によって決まります。数学でも未知の値を記号で表しますが、それも立派