Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

アンダースコア(_)ではじまるクラスの変数

f:id:Arty_Mireiyu:20220309170102p:plain

PyQチームのtsutomuです。
今日は、クラス内の特殊な変数名について紹介します。

このコラムは、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

そのほかのPythonで使われるアンダースコア(_)について

blog.pyq.jp

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.