PyQチームのtsutomuです。
今日は、クラス内の特殊な変数名について紹介します。
- このコラムは、PyQクエスト「オブジェクト指向入門(データ属性)」3問目に関連しています。
- アンダースコア1個(_)で始まるクラス変数やインスタンス変数
- アンダースコア2個(__)で始まるクラス変数やインスタンス変数
- 余談(アンダースコア2個から始まるグローバル変数)
- そのほかのPythonで使われるアンダースコア(_)について
このコラムは、PyQクエスト「オブジェクト指向入門(データ属性)」3問目に関連しています。
PyQを学習している方は、ぜひこちらも参照してください。
アンダースコア1個(_)で始まるクラス変数やインスタンス変数
アンダースコア1個で始まるクラス変数やインスタンス変数は、慣習的に「隠蔽したい」ことを表しています。
これはあくまで「参照しないで欲しい」という意思表示であり、実際には自クラス以外からも参照できます。
しかし、このような変数は自クラス以外から参照しないようにします。
アンダースコア2個(__)で始まるクラス変数やインスタンス変数
アンダースコア2個で始まるクラス変数やインスタンス変数は、自クラス以外から隠蔽されます。
しかし実際には、名前マングリング(名前難号化)という機能により変数名が変更されるだけです。
そのため、変更された変数名を使えば自クラス以外からも参照できます。
たとえば、Sample
クラスの__num3
という変数は、下記のように_Sample__num3
に変わります。
ただし、デバッグなどの特殊な状況以外では、_Sample__num3
を使って直接アクセスするのは推奨しません。
class Sample: def __init__(self): self.__num3 = 300 a = Sample() print(a._Sample__num3) # 300
参考:プライベート変数
余談(アンダースコア2個から始まるグローバル変数)
ちなみに、アンダースコア2個から始まるグローバル変数は、モジュール内のどこからでも利用できます。
よく使うのは、__name__
という変数でしょう。この変数は、実行されている状況により値が変わります。
python xxx.py
と実行した場合:xxx.py
の中では、__name__
の値は'__main__'
という固有の文字列になります- いずれかのファイルで
import xxx
された場合:xxx.py
の中では、__name__
の値はモジュール名(xxx
)になります
参照 blog.pyq.jp