48
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonのカプセル化とマングリングについて

Last updated at Posted at 2019-05-07

pythonにはprivate変数はありません。

しかしprivate変数に近いことは実現できます。

_1つのprefix

PEP8上のコーディング規約としては
_(アンダースコア)1つのprefixをclass内のみで利用する変数とされています。

この変数はfrom M import *とした場合、
importされません。

しかし、この変数名は単なる紳士協定にすぎず、
インスタンス化したオブジェクトからのアクセス時の
物理的な機構はなくカプセル化としての役目は果たせません。

__2つのprefix

__(アンダースコア)2つのprefixをつけた場合、
ネームマングリング機構が働きます。

Name Manglingとは名前修飾という意味で、
該当のprefixが付いている変数にはpythonコード上で意味が与えられます。

該当の変数名は_{class名}のprefixがついた変数名へと置換されます。

ただし、これもあくまで変数名が置換されるために
通常のような、インスタンスからの変数名へのアクセスが
できなくなるだけです。
通常よりは硬い実装にはなりますね。

あくまで変数名が変わっているだけなので
置換後の変数名へのアクセスは許します。

本来、ネームマングリング機構は
親クラスと子クラス間での名前衝突を避ける目的の為のもののようです。
(__init__や、__main__などのメソッドの所属元クラスをはっきりさせる)

具体例

class HogeHoge:
    _dummy_private = "hoge"
    __almost_private = "hoge"

class Main:
    hogehoge = HogeHoge()
    
    # 丸見え
    a = hogehoge._dummy_private

    # エラー
    b = hogehoge.__almost_private

    # こうするとアクセスできちゃう
    # _{class名}のprefixがついた変数名へと置換されている
    c = hogehoge._HogeHoge__almost_private

参考

pep8-ja 1.0 ドキュメント
python学習講座 プライベートメンバ

48
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
33

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?